Laravel 5使用OR条件和BETWEEN

时间:2016-03-10 19:17:24

标签: mysql laravel laravel-5 eloquent

嗨,任何人都可以帮我在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

5 个答案:

答案 0 :(得分:10)

查询生成器中提供了orWhereBetween方法,但它在Query Builder Documentation中没有记录。但是,您可以在Laravel API Documentation

中找到它

下面的解释假设变量具有以下值:

$newStart = '1';
$newEnd = '10';

不幸的是,使用orWhereBetween作为第二个条件并不适用于您的情况,因为whereBetweenorWhereBetween都会检查列值是否介于两个输入值之间。这可以从您的第一个条件开始,因为它检查existing_start列值是否在$newStart$newEnd之间。所以这很好:

->whereBetween('existing_start', [$newStart, $newEnd])

因为它将被编译为:

WHERE `existing_start` BETWEEN '1' AND '10'

但是,您的第二个条件是要检查来自$newStart的输入值是否在两个列值existing_startexisting_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();