我正在尝试使用 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 Expressions但这样就会出现SQL注入(inject)点。我已经使用查询生成器尝试了以下操作,但生成的查询(显然,查询结果)不是我想要的:
$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?
最佳答案
$results = DB::table('rooms')
->distinct()
->leftJoin('bookings', function($join)
{
$join->on('rooms.id', '=', 'bookings.room_type_id');
$join->on('arrival','>=',DB::raw("'2012-05-01'"));
$join->on('arrival','<=',DB::raw("'2012-05-10'"));
$join->on('departure','>=',DB::raw("'2012-05-01'"));
$join->on('departure','<=',DB::raw("'2012-05-10'"));
})
->where('bookings.room_type_id', '=', NULL)
->get();
不太确定是否可以将 Between 子句添加到 Laravel 中的联接中。
注释:
DB::raw()
指示 Laravel 不要放回引号。- 通过将闭包传递给连接方法,您可以向其添加更多连接条件,
on()
将添加AND
条件和orOn()
将添加OR
条件。
关于laravel - 使用查询生成器或 Eloquent 进行带有附加条件的 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16848987/