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
と同じです。私が正しく理解している場合
ような何かを行うことができます。右 ? – jaysingkar