首页 > 解决方案 > Laravel 急切加载两个模型之间的关系会导致其他模型之间的关系返回错误的结果

问题描述

我有两个名为 Question 和 Answer 的 Eloquent 模型,它们之间存在一对多的关系(一个问题有很多答案)。Question.php 中的 hasMany 关系称为answers

我还有一个 User 和 Company 模型,它们之间存在多对多关系,它们使用枢轴模型,定义如下:

用户.php

public function companies()
{
    return $this->belongsToMany(Company::class)
        ->using(CompanyUser::class);
}

公司.php

public function users()
{
    return $this->belongsToMany(User::class)
        ->using(CompanyUser::class);
}

当我检索一个问题并延迟加载它的答案时:

Question::find(58)->answers;

一切正常。当我使用急切加载时,问题就来了:

Question::with('answers')->get();

奇怪的事情发生了。在 Question 模型的 answers() 关系方法中,我需要获取当前用户的第一家公司才能修改关系:

auth()->user()->companies->first();

我的应用程序中的大多数用户都有一个公司附属于他们,当使用急切加载时,虽然auth()->user()->companies返回的不是一个,而是 134 个公司,即使在数据库中我只有 5 个公司和当前用户只属于一个。当我转储auth()->user()->companies集合的内容时,我看到第一个公司模型存在 130 次,其他 4 个公司也包括在内。

这仅发生在answers()方法中并且仅在使用急切加载时发生。任何想法为什么?

环境:

标签: laraveleloquenteager-loading

解决方案


我认为您需要获取有关该问题的更多信息。我通常做的是插入 ddd() 并检查查询选项卡以查看 Laravel 使用哪些查询来获取数据。这可能会更清楚地说明问题。


推荐阅读