LaravelクエリビルダーでJOINクエリを使用して条件を追加しようとしています。
<?php
$results = DB::select('
SELECT DISTINCT
*
FROM
rooms
LEFT JOIN bookings
ON rooms.id = bookings.room_type_id
AND ( bookings.arrival between ? and ?
OR bookings.departure between ? and ? )
WHERE
bookings.room_type_id IS NULL
LIMIT 20',
array('2012-05-01', '2012-05-10', '2012-05-01', '2012-05-10')
);
Raw式を使用できることはわかっていますが、SQLインジェクションポイントがあります。クエリビルダーで次のことを試しましたが、生成されたクエリ(および明らかにクエリ結果)は意図したものではありません:
$results = DB::table('rooms')
->distinct()
->leftJoin('bookings', function ($join) {
$join->on('rooms.id', '=', 'bookings.room_type_id');
})
->whereBetween('arrival', array('2012-05-01', '2012-05-10'))
->whereBetween('departure', array('2012-05-01', '2012-05-10'))
->where('bookings.room_type_id', '=', null)
->get();
これはLaravelによって生成されたクエリです:
select distinct * from `room_type_info`
left join `bookings`
on `room_type_info`.`id` = `bookings`.`room_type_id`
where `arrival` between ? and ?
and `departure` between ? and ?
and `bookings`.`room_type_id` is null
ご覧のとおり、クエリ出力には構造がありません(特にJOINスコープの場合)。JOINで条件を追加することはできますか?
Laravelのクエリビルダーを使用して同じクエリを作成するにはどうすればよいですか(可能な場合)Eloquentを使用する方が良いですか、それともDB :: selectを使用する必要がありますか?
and arrival >= ? and arrival <= ? and departure >= ? and departure <= ?
代わりになっているため、わずかに異なりますAND ( r.arrival between ? and ? OR r.departure between ? and ? )
(OR
句に注意してください)。これにより、結果に存在してはならない行が追加されます。QBを使用して結合ですべてのタイプの条件を生成することは不可能だと思います。