這可能是一個騙局,但我一直在拖網尋找適當的答案,並且還沒有找到。Laravel 4 - 在構建集合時附加where子句到關係的雄辯方法
所以基本上我想要做的就是連接兩個表,並根據連接表中的字段將where條件附加到整個集合。
所以可以說我有兩個表:
users:
-id
-name
-email
-password
-etc
user_addresses:
-address_line1
-address_line2
-town
-city
-etc
對於參數的緣故(意識到這可能不是最好的例子) - 讓我們假設一個用戶可以有多個地址條目。現在,laravel /雄辯給了我們一個以範圍的形式包含集合條件的好方法,所以我們將使用其中的一個來定義過濾器。
所以,如果我想獲得的所有用戶,在超人的地址,我可以按如下方式創建一個範圍和關係:
Users.php(模型)
class users extends Eloquent{
public function addresses(){
return $this->belongsToMany('Address');
}
public function scopeSmallvilleResidents($query){
return $query->join('user_addresses', function($join) {
$join->on('user.id', '=', 'user_addresses.user_id');
})->where('user_addresses.town', '=', 'Smallville');
}
}
這但它有點醜陋,它弄亂了我雄辯的對象,因爲我不再有一個很好的包含用戶地址的動態屬性,所有東西都擠在用戶對象中。
我曾嘗試過各種其他的事情來得到這個使用上的關係的關閉工作,例如看起來前途無量:
//這只是在過濾器的連接關係,從而將顯示所有用戶,但只點在它在所有
User::with('Addresses')->where('user_addresses.town', '=', 'Smallville');
User::with(array('Addresses' => function($query){
$query->where('town', '=', 'Smallville');
}));
//這不工作相匹配的地址拉那麼,有沒有運用WH的「雄辯」的方式以過濾主要集合並保持我的雄辯對象機智的方式創建關係的子句?還是我喜歡這麼多人被優雅的雄辯語法所破壞,以至於我問得太多了?
注意:我知道你通常可以通過定義其他方向的關係(例如首先訪問地址表)來解決這個問題,但這並不總是理想的,也不是我所要求的。
在此先感謝您的幫助。
顯然,它的工作原理就像你說的,這可能是脫離主題的,但是在設置'addresses()'關係時不應該使用'hasMany()'而不是'belongsToMany()'? – user1669496
是的,它應該 - 你的先生! – WebweaverD