我正在尝试在Laravel 10中构建一个hasManyThrough
关系。
我有三张table:users
表(标准Laravel列)、client_assignments
和media_ad_plans
在client_assignments
表中,可以将一个用户分配给多个客户端。在media_ad_plans
表中,一个条目属于一个客户端。
在我的Users
模型中,我这样定义关系:
public function adPlans(): HasManyThrough
{
return $this->hasManyThrough(
AdPlan::class,
ClientAssignment::class,
'user_id',
'client_id',
'id',
'client_id'
);
}
但是,当你做这样的事情时:
$users = User::with('adPlans.client')->whereHas('adPlans', function ($query) {
return $query->duringTodayUsing('material_deadline', false); // a custom scope
})->get();
返回与用户关联的所有广告计划项,而不仅仅是与whereHas
语句匹配的项。我在whereHas
闭包中尝试了一个简单的查询,但它并没有改变输出--我仍然为用户获取所有项。我怀疑我的关系是畸形的,或者也许我在做一些“非法”的事情。
客户分配:
广告计划(每个问题的有用字段):
1条答案
按热度按时间blpfk2vs1#
->whereHas()
对单独的->with()
子句没有影响。您的代码完全按预期工作;whereHas()
根据'adPlans', function ($query) { ... })
过滤返回哪些User
记录,但->with('adPlans.client')
正确返回每个User
的关联adPlans
记录的ALL。你需要将你的逻辑复制到
->with()
子句中,比如:或者使用Laravel的
->withWhereHas()
子句:文件:
https://laravel.com/docs/10.x/eloquent-relationships#constraining-eager-loads-with-relationship-existence