我试图使用Laravel Query Builder中的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')
);
我知道我可以使用原始表达式,但这样就会有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的Query Builder构建相同的查询(如果可能的话)使用Eloquent更好,还是应该使用DB::select?
9条答案
按热度按时间xlpyo6sf1#
不太确定between子句是否可以添加到laravel中的join中。
备注:
DB::raw()
指示Laravel不要放回引号。on()
将添加AND
条件,orOn()
将添加OR
条件。cwdobuhd2#
如果你有一些参数,你可以这样做。
然后返回您的查询
return $results;
wwwo4jvm3#
你可以在左连接中复制这些括号:
是
然后,您必须稍后使用“setBindings”设置绑定,如本SO帖子所述:How to bind parameters to a raw DB query in Laravel that's used on a model?
虽然不好看但很管用。
disho6za4#
sql查询示例如下
Laravel多条件加入
x9ybnkn65#
我使用的是laravel5.2,我们可以添加不同选项的连接,你可以根据你的要求修改。
t2a7ltrp6#
对于条件参数,我们可以使用
where
,cwdobuhd7#
原始查询和标准选择之间存在差异(
DB::raw
和DB::select
方法之间)。您可以使用
DB::select
来完成您想要的操作,只需添加?
占位符,就像使用预准备语句一样(这实际上就是它正在做的事情)。举个小例子:
第二个参数是一个值数组,将用于从左到右替换查询中的占位符。
k5ifujac8#
我的五美分计划左加入(..或)和(..或..)和..
u4dcyp6a9#
新版本提示:
除了使用两个on-condition(AND-Conditions),您还可以在其所有函数中使用orOn()-Conditions,as Between,...