2017-06-22 78 views
1

嗨我有3个数据库表。这里是我的查询:Laravel查询关系和条件

$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的网页我真的不明白为什么?有什么建议么?

+0

而不是插入你产生疑问,这是既难读B/C是按比例缩小,而不可能选择和复制,或搜索的图像,你会请复制并将其作为代码块粘贴? – jeffbyrnes

+0

也许你可以尝试使用示波器来简化你的问题。 https://laravel.com/docs/5.4/eloquent#local-scopes –

回答

4

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

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

$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')); 
       }); 
      }); 
+0

好吧,我明白...但仍然得到页状态= 0。我认为问题是我正在访问PageNav模型,并且与Page和PageLang模型有关系。状态存储在页表中,而不是在PageNav中。 我无法通过Page模型访问它,因为我使用的是Laravel的Baum扩展,它的表在PageNav – general666

+0

无论如何找到解决方案谢谢! :) – general666

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();