【问题标题】:Laravel / Lumen relationship - join other table where condition retrieve wrongLaravel / Lumen 关系 - 加入条件检索错误的其他表
【发布时间】:2018-04-15 10:28:05
【问题描述】:

在比较两个日期时,我在从数据库中检索一些数据时遇到了一个奇怪的问题。

数据库结构: 用户、预订、reservation_services、services_price_history

根据上表: 一个用户有很多预订,一个预订有很多服务,一个服务有很多价格历史。

我需要接受所有用户的预订,然后根据预订日期找到服务价格。

问题是当我添加日期比较条件时没有考虑到它

代码:

$users = User::with(['reservations' => function($query) use ($department_id, $date_start, $date_end) {

    // reservation services
    $query->with(['reservation_services' => function($query) {
        $query->join('reservations', 'reservation_services.reservation_id', 'reservations.id');
        $query->join('services', 'reservation_services.service_id', 'services.id');

        // Find the service price based on reservation date
        $query->join('services_price_history', function($query) {
            $query->on('reservations.salon_id', 'services_price_history.salon_id');
            $query->on('reservation_services.service_id', 'services_price_history.service_id');

            // this shoud be the condition that gives us the correct
            // price based on the reservation date
            $query->where('services_price_history.date_start', '<', 'reservations.date');
           // then we use order and limit 1
        });

        $query->select(
            'reservation_services.reservation_id',
            'reservation_services.service_id',
            'reservation_services.quantity',
            'services_price_history.price',
            'services_price_history.date_start',
            'services.name',
            DB::raw('(services_price_history.price * reservation_services.quantity) as total')
        );
        $query->orderBy('services_price_history.id', 'desc');
    }]);
}])->get();

这是输出:

[
   {
      "id":10,
      "first_name":"Mihaela",
      "last_name":"Radulescu",
      "reservations":[
         {
            "id":112,
            "salon_id":2,
            "client_id":161,
            "user_id":10,
            "date":"2017-10-31", // the reservation date
            "start":"10:00",
            "end":"12:00",
            "state_id":5,
            "notes":null,
            "price":"350.00",
            "reservation_services":[
               {
                  "reservation_id":112,
                  "service_id":89,
                  "quantity":1,
                  "price":"400.00",
                  "date_start":"2017-11-02", // this is wrong
                  "name":"Tratament ANTI AGE",
                  "total":"400.00"
               },
               {
                  "reservation_id":112,
                  "service_id":89,
                  "quantity":1,
                  "price":"350.00",
                  "date_start":"2017-10-19", // this is ok
                  "name":"Tratament ANTI AGE",
                  "total":"350.00"
               }
            ],
            "reservation_products":[

            ]
         },
      ]
   },
],

我真的不知道为什么,但是代码上的这一行

$query-&gt;where('services_price_history.date_start', '&lt;', 'reservations.date');

没有正常工作,因为'2017-11-02' 高于'2017-10-31',但它显示在结果中。

非常感谢。

【问题讨论】:

    标签: php mysql laravel lumen laravel-eloquent


    【解决方案1】:

    代替:

    $query->where('services_price_history.date_start', '<', 'reservations.date');
    

    使用:

    $query->whereRaw('services_price_history.date_start < reservations.date');
    

    【讨论】:

    • 它就像一个魅力!拜托,你能解释一下为什么吗?我看不出有什么不同,我有点沮丧。非常感谢!
    • 当使用 where 时,在这种情况下第三个参数是值,它使用 PDO 准备好的语句自动绑定,而当使用 whereRaw 时,显示的代码中没有准备好的语句,所以现在使用它正如它所写的那样,这就是你所需要的
    • 非常感谢。这说得通。知道如何在 $query-&gt;whereRaw('services_price_history.date_start &lt; reservations.date'); 之后立即限制结果吗?使用$query-&gt;limit(1)first() 似乎行不通。
    猜你喜欢
    • 1970-01-01
    • 2021-02-22
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多