【问题标题】:Laravel: How to apply where condition only when the field value is not NULLLaravel:如何仅在字段值不为 NULL 时应用 where 条件
【发布时间】:2015-08-31 21:40:08
【问题描述】:

尝试在 laravel 中编写查询:

 return DB::table('course_modules')->select('module_id', 'publish_from', 'publish_to')
                    ->where('course_id', $course_id)
                    ->where('is_deleted', '0')
                 ->orwhere('publish_from', '>=', date('Y-m-d H:i:s'))
                    ->orwhere('publish_to', '<=', date('Y-m-d H:i:s'))
                    ->orwhere(function($query) {
                                $query->where('publish_from', '>=', date('Y-m-d H:i:s'))
                                ->where('publish_to', '<=', date('Y-m-d H:i:s'));
                            })
                    ->where('hide_module', 1)
                    ->get();

我只想在 publish_to 和 publish_from 字段不为 NULL 时应用 where 子句。

我想这样做:

 if(publish_from!=NULL){   ->orwhere('publish_from', '>=', date('Y-m-d H:i:s'))}   

同样的方式:

 if(publish_to!=NULL){   ->orwhere('publish_to', '>=', date('Y-m-d H:i:s'))}

没有得到确切的方法。帮助...

【问题讨论】:

  • 这样使用 where('field', '!=', null)
  • 我想这样做: if(publish_from!=NULL){ ->orwhere('publish_from', '>=', date('Y-m-d H:i:s'))} AND相同的方法:f(publish_to!=NULL){ ->orwhere('publish_to', '>=', date('Y-m-d H:i:s'))}

标签: laravel where-clause


【解决方案1】:

你必须重新考虑你的逻辑,因为 SQL 语句在条件 wheres 上不是很好......所以你真正想要的是 publish_frompublish_to 要么是 NULL 要么在某个范围内.

这应该实现:

return DB::table('course_modules')->select('module_id', 'publish_from', 'publish_to')
    ->where('course_id', $course_id)
    ->where('is_deleted', '0')
    ->where('hide_module', 1)
    ->where(function($q){
        $q->where(function($q){
            $q->whereNull('publish_from')
              ->whereNull('publish_to');
        })->orWhere(function($q){
            $q->where('publish_from', '>=', date('Y-m-d H:i:s'))
              ->where('publish_to', '<=', date('Y-m-d H:i:s'));
        });
    })
    ->get();

请注意,这里不一定需要两级嵌套闭包,但这样更易于阅读,并且可以避免错误。

另外,您可以将date('Y-m-d H:i:s') 切换为Carbon::now(),如果您问我,这会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-16
    • 2020-04-20
    • 2017-12-21
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2021-05-05
    相关资源
    最近更新 更多