【问题标题】:laravel collections complex and/or Expressionslaravel 集合复杂和/或表达式
【发布时间】:2019-09-30 20:24:47
【问题描述】:

尝试使用和/或 where 语句,就好像它们嵌套在括号中一样。 示例:

Select * from myTable
where
  (id > 78 or name is not null)
  and term_date >= NOW())

尝试让这些复杂的 where 语句在 Laravel 集合中使用,如下所示:

$query = myTableModel::where(['id', '>', 78])
    ->orWhereNotNull('name')
    ->where('term_date', '>=', date('Y-m-d'))

但是这种类型的查询会返回一个这样的地方

where
  (id > 78 or
  name is not null and
  term_date >= Now())

或任何其他奇怪的 where 组合,而不是设置嵌套括号。

有没有办法使用 laravel Collections 解决此类问题?

【问题讨论】:

    标签: php mysql laravel collections


    【解决方案1】:

    要获得您想要实现的查询,您可以尝试向 where 方法添加回调并在其中添加您的 where/orWhere ,如下所示:

    $query = myTableModel::where(function($query) {
        $query->where('id', '>', 78)
            ->orWhereNotNull('name');
    })->where('term_date', '>=', date('Y-m-d'));
    

    在本地用户模型上运行它会在执行 toSql() 时给出以下结果,我相信这是你所追求的。

    select * from `users` where (`id` > ? or `name` is not null) and `term_date` >= ?
    

    【讨论】:

      【解决方案2】:

      所以,解决这个问题的概念是使用闭包。

      如果你想完成我给出的例子,那么你会做这样的事情

      $query = mytableModel::where(function($q){
          $q->where(['id', '>', 78])
              ->orWhereNotNull('name');
          })->where('term_date', '>=', date('Y-m-d'))
          ->get();
      

      更复杂的例子请Click Here

      【讨论】:

        猜你喜欢
        • 2017-08-05
        • 1970-01-01
        • 2017-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多