2017-06-22 124 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();