我有2个SQL表格:一个代表游览,另一个代表那些游览的预订。结构如下:雄辩有问题
tours
(int) id
(int) max_participants
(int) state
bookings
(int) id
(fk) tour
(fk) date
(int) num_passengers
的预订表有一个日期FK,但该表是非常简单的,而不是重要的,因为它没有给我任何麻烦。
现在我需要过滤我的旅行团,只向客户展示可以容纳他所需乘客人数的旅行团。因此,假设一次旅行的最多参与人数为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是硬编码!这是一个严重的问题,因为每个巡视的最大参与者数量不同。
任何人都可以找出一种方法来解决这个问题,并解除50的硬编码?它应该是tours
。 max_participants
与SQL中一样。
你可以通过变量'$ max_participants'就像'$ date'。对 ? – jaysingkar