san*_*anu 4 mysql laravel eloquent laravel-5
嗨,任何人都可以帮我建立下面的laravel Eloquent查询我真的很混淆使用OR条件与之间
SELECT * FROM tbl WHERE
existing_start BETWEEN $newSTart AND $newEnd OR
$newStart BETWEEN existing_start AND existing_end
Run Code Online (Sandbox Code Playgroud)
我尝试使用喜欢
whereBetween('existing_start',[$newSTart,$newEnd])
Run Code Online (Sandbox Code Playgroud)
但不知道如何使用OR
Bog*_*dan 10
orWhereBetween查询生成器提供了一种方法,但它在查询生成器文档中没有记录.但是,您可以在Laravel API文档中找到它.
下面的解释假设变量具有以下值:
$newStart = '1';
$newEnd = '10';
Run Code Online (Sandbox Code Playgroud)
可惜的是,使用orWhereBetween第二个条件是不适合你的情况,因为两者whereBetween并orWhereBetween会检查是否有列值是两个输入值之间.这可以从你的第一个条件开始,因为它检查 existing_start列值是否在$newStart和之间$newEnd.所以这很好:
->whereBetween('existing_start', [$newStart, $newEnd])
Run Code Online (Sandbox Code Playgroud)
因为它将被编译为:
WHERE `existing_start` BETWEEN '1' AND '10'
Run Code Online (Sandbox Code Playgroud)
但是你的第二个条件要检查是否从输入值$newStart是两列的值之间existing_start和existing_end,并没有查询生成器方法做到这一点.所以这不起作用:
->orWhereBetween($newStart, ['existing_start', 'existing_end'])
Run Code Online (Sandbox Code Playgroud)
因为它将被编译为:
OR `1` BETWEEN 'existing_start' AND 'existing_end'
Run Code Online (Sandbox Code Playgroud)
注意`周围的反引号1,因为MySQL会尝试找到一个名为的列1并抛出错误.
所以这里最好的选择是使用这样orWhereRaw的绑定:
DB::table('tbl')
->whereBetween('existing_start', [$newStart, $newEnd])
->orWhereRaw('? BETWEEN existing_start AND existing_end', [$newStart])
->get();
Run Code Online (Sandbox Code Playgroud)
该?会通过的值来代替$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();
Run Code Online (Sandbox Code Playgroud)
哪个将编译为:
SELECT * FROM `tbl`
WHERE
`existing_start` BETWEEN '1' AND '10' OR
(`existing_start` <= '1' AND `existing_end` >= '1')
Run Code Online (Sandbox Code Playgroud)
你是对的,你可以使用 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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12571 次 |
| 最近记录: |