Laravel Builder中的1 where子句中有2个条件

时间:2019-06-21 04:48:23

标签: sql laravel laravel-5 eloquent

我想将查询转换为laravel构建器格式:

这是我的工作查询:

SELECT * FROM tickets
WHERE tic_status_id = 65
AND (tic_escalation_date1 IS NULL OR tic_escalation_date1 < DATE('2019-06-22 13:00:00'))
AND (tic_escalation_date2 IS NULL OR tic_escalation_date2 < DATE('2019-06-22 13:00:00'))
AND (tic_escalation_date3 IS NULL OR tic_escalation_date3 < DATE('2019-06-22 13:00:00'))

我正在尝试使用whereNull和orWhere,但是它不起作用。

3 个答案:

答案 0 :(得分:4)

您可以使用Parameter Grouping来约束or或where。

  

将闭包传递给where方法可指示查询构建器执行以下操作:   开始一个约束组。关闭将收到一个查询生成器   您可以用来设置约束的实例   包含在括号组中。

然后,在约束内,您可以使用whereNull()向查询添加“ where null”子句,并使用orWhereDate()向查询添加“ or where date”语句。请注意,whereDate方法将从datetime表达式中删除日期部分。

DB::table('tickets')
            ->where('tic_status_id', '=', 65)
            ->where(function ($query) {
                $query->whereNull('tic_escalation_date1')
                      ->orWhereDate('tic_escalation_date1', '<', '2019-06-22 13:00:00');
            })
            ->where(function ($query) {
                $query->whereNull('tic_escalation_date2')
                      ->orWhereDate('tic_escalation_date2', '<', '2019-06-22 13:00:00');
            })
            ->where(function ($query) {
                $query->whereNull('tic_escalation_date3')
                      ->orWhereDate('tic_escalation_date3', '<', '2019-06-22 13:00:00');
            })
            ->get();

答案 1 :(得分:1)

您可以尝试以下代码:

    $tickets = DB::table('tickets');
    $tickets->where('tic_status_id', 65);
    $tickets->where(function($query){
        $query->whereNull('tic_escalation_date1');
        $query->orWhereDate('tic_escalation_date1', '<', DATE('2019-06-22 13:00:00'));
    });
    $tickets->where(function($query){
        $query->whereNull('tic_escalation_date2');
        $query->orWhereDate('tic_escalation_date2', '<', DATE('2019-06-22 13:00:00'));
    });
    $tickets->where(function($query){
        $query->whereNull('tic_escalation_date3');
        $query->orWhereDate('tic_escalation_date3', '<', DATE('2019-06-22 13:00:00'));
    });
    $ticket_data = $tickets->get();

有关更多信息,请参考laravel。如果您有“ DateTime”类型以外的其他列,则可以使用“ orWhere”代替“ orWhereDate”。

答案 2 :(得分:0)

你可以试试吗

方法一

$query = DB::table( 'tickets')
            ->where( 'tic_status_id' ,'=',65)
            ->whereNull( 'tic_escalation_date1')
            ->orWhere( 'tic_escalation_date1', '<', "DATE('2019-06-22 13:00:00')")
            ->whereNull( 'tic_escalation_date2')
            ->orWhere( 'tic_escalation_date2', '<', "DATE('2019-06-22 13:00:00')")
            ->whereNull( 'tic_escalation_date3')
            ->orWhere( 'tic_escalation_date3', '<', "DATE('2019-06-22 13:00:00')");

方法二 I am Not Sure About the this query will Work Fine

$query = DB::table( 'tickets')
            ->where( 'tic_status_id' ,'=',65)
            ->whereNull( 'tic_escalation_date1')
            ->orWhereDate( 'tic_escalation_date1', '<', "('2019-06-22 13:00:00')")
            ->whereNull( 'tic_escalation_date2')
            ->orWhereDate( 'tic_escalation_date2', '<', "DATE('2019-06-22 13:00:00')")
            ->whereNull( 'tic_escalation_date3')
            ->orWhereDate( 'tic_escalation_date3', '<', "DATE('2019-06-22 13:00:00')");