Laravel查询关系和条件

时间:2017-06-22 14:02:04

标签: laravel eloquent relationship

嗨我在DB中有3个表。这是我的疑问:

$nav = PageNav::with([
                    'page' => function($query) {
                        $query->where('status', 1)
                              ->where(function($query) {
                                    $query->whereNull('publish_up')
                                          ->whereNull('publish_down');
                                })
                              ->orWhere(function ($query) {
                                    $query->where('publish_up', '<', date('Y-m-d H:i:s'))
                                          ->where('publish_down', '>', date('Y-m-d H:i:s'));
                                });
                    },
                    'langs' => function ($query) use ($lang) {$query->where('language_code', '=', $lang);},
                ])
                ->get();

它生成此查询: enter image description here

当我循环$ nav时,仍然有状态= 0的页面。我真的不明白为什么?有什么建议吗?

2 个答案:

答案 0 :(得分:4)

与任何SQL查询或Eloquent查询一样,OR完全区分条件,因此只要您有一个雄辩的orWhere,它就会匹配OR之前或之后匹配的任何内容。

您可以通过在SQL中使用嵌套的where或括号来解决此问题,以正确封装条件。

    $query->where('status', 1)
          ->whereNested(function($q1) {
               $q1->where(function($query) {
                    $query->whereNull('publish_up')
                          ->whereNull('publish_down');
                })
               ->orWhere(function ($query) {
                    $query->where('publish_up', '<', date('Y-m-d H:i:s'))
                          ->where('publish_down', '>', date('Y-m-d H:i:s'));
                });
           });

答案 1 :(得分:0)

好的,我找到了解决方案。需要将条件包装到whereHas

$nav = PageNav::whereHas('page', function ($query) {
                        $query->where('status', 1)
                              ->whereNested(function($q1) {
                                  $q1->where(function($query) {
                                        $query->whereNull('publish_up')
                                              ->whereNull('publish_down');
                                    })
                                  ->orWhere(function ($query) {
                                        $query->where('publish_up', '<', date('Y-m-d H:i:s'))
                                              ->where('publish_down', '>', date('Y-m-d H:i:s'));
                                    });
                              });
                    })
                    ->with([
                    'page',
                    'langs' => function ($query) use ($lang) {
                        $query->where('language_code', '=', $lang);
                    }
                ])
                ->get();