雄辩有问题

时间:2016-09-20 12:11:17

标签: sql laravel eloquent

我有2个SQL表:一个表示旅行,另一个表示这些旅行的预订。结构如下:

tours
(int) id 
(int) max_participants
(int) state

bookings
(int) id
(fk)  tour
(fk)  date
(int) num_passengers

预订表的日期为FK,但该表非常简单,并不重要,因为它没有给我任何麻烦。

现在我需要过滤我的旅程,并且只向客户展示仍然可以容纳他想要的乘客数量的旅行。因此,假设一次旅游的max_participants为50,并且在某个日期的几次预订中已经有48位num_passengers,我必须拒绝额外预订3位乘客(48 + 3> = 50),但接受2位乘客的额外预订(因为48 + 2> = 50)。

我推出了这个SQL,它运行得很好(有些值是为了便于阅读而硬编码,但它们正在使用变量):

select * from `tours` where `state` = 1
and exists (select * from `bookings` where `bookings`.`tour` = `tours`.`id` and `date` = 280 having SUM(num_passengers) + 2 <= `tours`.`max_participants`)

当我试图以雄辩的方式做到这一点时,我做到了这一点:

$tours = Tour::where('state', 1)
->whereHas('toursBookings', function ($query) use ($request, $date) {
    return $query->where('date', $date->id)
        ->havingRaw('SUM(num_passengers) + ' . $request->get('filter_number_passengers') . ' <= ?', [50]);
})
->get();

这个作品就像一个魅力所做的一切应该做的但是数字50是硬编码的!这是一个严重的问题,因为每个游览都有不同数量的max_participants。

任何人都可以找到解决这个问题的方法并解开那个50的硬编码吗?它应该是toursmax_participants,就像在SQL中一样。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,你可以做这样的事情

$max_participants = [50];
$tours = Tour::where('state', 1)
->whereHas('toursBookings', function ($query) use ($request, $date,$max_participants) {
    return $query->where('date', $date->id)
        ->havingRaw('SUM(num_passengers) + ' . $request->get('filter_number_passengers') . ' <= tours.max_participants');
})
->get();