这可能是一个骗局,但我一直在寻找一个正确的答案,但我还没有找到一个。
所以基本上我想要做的就是连接两个表,并根据连接表中的字段将 where 条件附加到整个集合。
所以可以说我有两张桌子:
users:
-id
-name
-email
-password
-etc
user_addresses:
-address_line1
-address_line2
-town
-city
-etc
为了争论(意识到这可能不是最好的例子)——让我们假设一个用户可以有多个地址条目。现在,laravel/eloquent 为我们提供了一种以作用域的形式在集合上包装条件的好方法,因此我们将使用其中一个来定义过滤器。
因此,如果我想在 smallville 中获取所有具有地址的用户,我可以创建一个范围和关系,如下所示:
用户.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(array('Addresses' => function($query){
$query->where('town', '=', 'Smallville');
}));
//这根本不起作用
User::with('Addresses')->where('user_addresses.town', '=', 'Smallville');
那么是否有一种“雄辩”的方式将 where 子句应用于关系,以过滤主集合并保持我雄辩的对象的机智?还是我喜欢很多其他人都被 Eloquent 的优雅语法宠坏了,以至于我要求太多了?
注意:我知道您通常可以通过定义另一个方向的关系(例如首先访问地址表)来解决这个问题,但这并不总是理想的,也不是我所要求的。
提前感谢您的帮助。