4

这可能是一个骗局,但我一直在寻找一个正确的答案,但我还没有找到一个。

所以基本上我想要做的就是连接两个表,并根据连接表中的字段将 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 的优雅语法宠坏了,以至于我要求太多了?

注意:我知道您通常可以通过定义另一个方向的关系(例如首先访问地址表)来解决这个问题,但这并不总是理想的,也不是我所要求的。

提前感谢您的帮助。

4

2 回答 2

2

此时,您无法根据相关模型中的约束过滤主模型。这意味着,您不能只获得Users一次user_address.town = 'Smallwille'刷卡的人。

就我个人而言,我希望这将很快得到实施,因为我可以看到很多人都在要求它(包括我自己)。

当前的解决方法很混乱,但它有效:

$products = array();
$categories  = Category::where('type', 'fruit')->get();
foreach($categories as $category)
{
 $products = array_merge($products, $category->products);
}
return $products;
于 2013-10-28T13:57:50.243 回答
1

如问题中所述,有一种方法可以先过滤地址,然后使用急切加载来加载相关的用户对象。如此:

$addressFilter = Addresses::with('Users')->where('town', $keyword)->first(); $users= $addressFilter->users;

当然与模型中的 belongsTo 绑定。

/// *如果有人阅读也想使用预过滤的用户数据,您可以将闭包传递给“with”

$usersFilter = Addresses::with(array('Users' => function($query) use ($keyword){ 
        $query->where('somefield', $keyword);
    }))->where('town', $keyword)->first();
$myUsers = $usersFilter->users;
于 2014-07-14T22:56:08.540 回答