嗨,任何人都可以帮我在laravel中建立以下查询Eloquent我真的很混淆使用 OR 条件
SELECT * FROM tbl WHERE
existing_start BETWEEN $newSTart AND $newEnd OR
$newStart BETWEEN existing_start AND existing_end
我尝试使用喜欢
whereBetween('existing_start',[$newSTart,$newEnd])
但不知道如何使用OR
答案 0 :(得分:10)
查询生成器中提供了orWhereBetween
方法,但它在Query Builder Documentation中没有记录。但是,您可以在Laravel API Documentation。
下面的解释假设变量具有以下值:
$newStart = '1';
$newEnd = '10';
不幸的是,使用orWhereBetween
作为第二个条件并不适用于您的情况,因为whereBetween
和orWhereBetween
都会检查列值是否介于两个输入值之间。这可以从您的第一个条件开始,因为它检查existing_start
列值是否在$newStart
和$newEnd
之间。所以这很好:
->whereBetween('existing_start', [$newStart, $newEnd])
因为它将被编译为:
WHERE `existing_start` BETWEEN '1' AND '10'
但是,您的第二个条件是要检查来自$newStart
的输入值是否在两个列值existing_start
和existing_end
之间,并且没有查询生成器方法可以执行此操作。所以这不起作用:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
因为它将被编译为:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
请注意`
周围的反引号1
,因为MySQL会尝试查找名为1
的列并抛出错误。
所以这里最好的选择是使用orWhereRaw
这样的绑定:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
?
将替换为$newStart
的值,该值将被正确引用并转义以避免SQL注入。
或者当然总是可以选择两个分组条件来检查边界,这相当于您的BETWEEN
条件:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhere(function ($query) use ($newStart) {
$query->where('existing_start', '<=', $newStart);
$query->where('existing_end', '>=', $newStart);
})->get();
将编译为:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')
答案 1 :(得分:1)
你是对的,你可以使用Eloquent的whereBetween()
。对于OR,您应该使用orWhere()
:
https://laravel.com/docs/5.1/queries#advanced-where-clauses
我不能100%确定它是否有效,但你可以试试这个:
$data = DB::table('tbl')
->whereBetween('existing_start', [$newSTart, $newEnd])
->orWhere(function ($query) {
$query->whereBetween($newStart, [existing_start, existing_end])
})
->get();
答案 2 :(得分:1)
$start_date_w1 = Carbon::now()->subDays(7)->format('Y-m-d 00:00:00');
$end_date_w1 = Carbon::now()->subDays(7)->format('Y-m-d 23:59:59');
$start_date_w2 = Carbon::now()->subDays(14)->format('Y-m-d 00:00:00');
$end_date_w2 = Carbon::now()->subDays(14)->format('Y-m-d 23:59:59');
$parents = AdoptiveParent::whereBetween('created_at', [$start_date_w1,$end_date_w1])
->orWhere(function ($query) use($start_date_w2,$end_date_w2) {
return $query->whereBetween('created_at', [$start_date_w2,$end_date_w2]);
})
->get();
return $parents;
此查询将帮助您从7天和14天之前创建的(自适应父代模型)中查找父代。
检查您是否已将 $ start_date_w2,$ end_date_w2 参数用于子查询,例如->orWhere(function ($query) use($start_date_w2,$end_date_w2)
答案 3 :(得分:0)
这对我有用。
$sql->where(function ($query) {
$query->whereBetween('start_date', ['2018-04-04', '2018-04-25']);
$query->orWhereBetween('cancelled_at', ['2018-04-04', '2018-05-01']);
});
答案 4 :(得分:0)
您必须对参数进行分组,修改文档中的示例
DB::table('users')
->where('name', '=', 'John')
->where(function ($query) {
$query->where('votes', '>', 100)
->orWhere('title', '=', 'Admin');
})
->get();