Laravel:有很多通过不尊重WhereHas

ddrv8njm  于 2023-06-30  发布在  其他
关注(0)|答案(1)|浏览(105)

我正在尝试在Laravel 10中构建一个hasManyThrough关系。
我有三张table:users表(标准Laravel列)、client_assignmentsmedia_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闭包中尝试了一个简单的查询,但它并没有改变输出--我仍然为用户获取所有项。我怀疑我的关系是畸形的,或者也许我在做一些“非法”的事情。
客户分配:

广告计划(每个问题的有用字段):

blpfk2vs

blpfk2vs1#

->whereHas()对单独的->with()子句没有影响。您的代码完全按预期工作; whereHas()根据'adPlans', function ($query) { ... })过滤返回哪些User记录,但->with('adPlans.client')正确返回每个User的关联adPlans记录的ALL
你需要将你的逻辑复制到->with()子句中,比如:

$users = User::with(['adPlans' => function ($query) {
  return $query->with('client')->duringTodayUsing('material_deadline', false);
}])->whereHas('adPlans', function ($query) {
  return $query->duringTodayUsing('material_deadline', false);
})->get();

或者使用Laravel的->withWhereHas()子句:

$users = User::withWhereHas('adPlans', function ($query) {
  return $query->with('client')->duringTodayUsing('material_deadline', false);
})->get();

文件:
https://laravel.com/docs/10.x/eloquent-relationships#constraining-eager-loads-with-relationship-existence

相关问题