2016-09-20 7 views
1

2つのSQLテーブルがあります。1つはツアーを表し、もう1つはそのツアーの予約を表します。次のような構造は、次のとおりです。Ellquent havingRaw problems

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) (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をハードコードする方法を見つけ出すことはできますか?それはtoursでなければなりません。 max_participantsと同じです。私が正しく理解している場合

+0

ような何かを行うことができます。右 ? – jaysingkar

答えて

1

あなたがちょうど$のdate` `のような変数` $のmax_participants`を渡すことができ、この

$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はツアーテーブルのフィールドなので、ツアーからツアーに変更する必要があるからです。ツアー1には50のmax_participantsがあり、tour2には30のmax_participantsがあり、tour3_には90のmax_participantsが含まれているとします。 –

+0

このケースでは、直接入力することができますそこに列の名前 – jaysingkar

+0

これは絶対に正しいです!どうもありがとうございます :-) –