2016-09-20 150 views
1

我有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的硬编码?它应该是toursmax_participants与SQL中一样。

+0

你可以通过变量'$ max_participants'就像'$ date'。对 ? – jaysingkar

回答

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(); 
+0

好吧,不完全是因为$ max_participants是tours表中的一个字段,所以它需要从tour更改为tour。让我们假设tour1的max_participants为50,tour2的max_participants为30,tour3_的max_participants为90.雄辩需要使用正确的值,而不是硬编码的值... –

+0

在这种情况下,可以直接把列名有 – jaysingkar

+0

这是绝对正确的!非常感谢 :-) –