【问题标题】:2 condition in 1 where clause in Laravel BuilderLaravel Builder 中的 1 where 子句中的 2 个条件
【发布时间】:2019-11-03 22:12:03
【问题描述】:

我想将我的查询转换成 laravel builder 格式:

这是我的工作查询:

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 但它不起作用。

【问题讨论】:

    标签: sql laravel laravel-5 eloquent


    【解决方案1】:

    您可以使用Parameter Grouping 来限制或限制位置。

    将闭包传递给 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();
    

    【讨论】:

    • orWhereDate 和 orWhere 有什么区别?
    • whereDate 方法可用于将列的值与日期进行比较,从日期时间表达式中取出日期部分。
    【解决方案2】:

    你可以试试下面的代码:

        $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”。

    【讨论】:

      【解决方案3】:

      你可以试试这个

      方法一

      $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')");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-10
        • 2020-07-26
        • 2018-09-16
        • 2019-02-09
        • 2019-03-11
        • 2021-05-13
        • 1970-01-01
        相关资源
        最近更新 更多