Laravel 5使用OR条件和BETWEEN

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第二个条件是不适合你的情况,因为两者whereBetweenorWhereBetween会检查是否有列值是两个输入值之间.这可以从你的第一个条件开始,因为它检查 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_startexisting_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)


Ale*_*nin 2

你是对的,你可以使用 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)