2014-10-04 119 views
1

多個whereHas標準我有兩個表 - 接觸和訪問:Laravel的關係

聯繫人表

id | name   
----- | ------- 
1  | Joe 
2  | Sally 

訪問表

id | contact_id | pathname | referrer     
----- | ------- | ------- | ------- 
1  | 1   | about  | google 
2  | 1   | pricing | null 
3  | 1   | signup | null 
4  | 2   | about  | null 
5  | 2   | signup | null 

使用侃侃而談,我想檢索所有聯繫人有一個路徑名稱 ='註冊'和一個引用者 ='google'。

到目前爲止,我已經得到了什麼是:

Contact::whereHas('visits', function($query) { 
    $query->where('pathname','=','signup'); 
}) 
->orWhereHas('visits', function($query) { 
    $query->where('referrer','=','google'); 
}) 
->get(); 

哪個正確檢索訪問過的任何定價或註冊頁面的所有聯繫人。

但是,此示例還會檢索Sally(來自上面的示例表),因爲她訪問了註冊,但未被google引用。我需要一種方法來檢索Joe,他們都是通過google引用並訪問了定價。

任何想法?提前致謝!

回答

5

您可以使用:

Contact::whereHas('visits', function($query) { 
    $query->where('pathname','=','signup'); 
}) 
->whereHas('visits', function($query) { 
    $query->where('referrer','=','google'); 
}) 
->get(); 
+0

這正是我所期待的。謝謝Marcin! – user3415951 2014-10-04 19:06:33

0

改良版本上面的代碼:

Contact::whereHas('visits', function($query) { 
    $query->where('pathname','signup')->where('referrer','google'); 
})->get(); 

幾個值得注意的要點:

  1. 你可以連續封閉內where()條款。
  2. where子句的默認運算符是=,因此您可以忽略它。
  3. 訪問多個相關模型時,使用多個whereHas()子句。