laravel - 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()方法中并且仅在使用急切加载时发生。任何想法为什么?
环境:
- Laravel 版本:6.20.6
- PHP版本:8.0.1
- 阿帕奇:2.4.26
- 数据库:10.1.27-MariaDB
解决方案
我认为您需要获取有关该问题的更多信息。我通常做的是插入 ddd() 并检查查询选项卡以查看 Laravel 使用哪些查询来获取数据。这可能会更清楚地说明问题。
推荐阅读
- flutter - 如何更改 State of class 中的 bool 扩展?
- swift - 使用表格显示添加的用户及其数据
- javascript - 为什么在 JavaScript for Loop 中声明 vs 不声明变量的行为不同?
- c# - 如果数据类型很长,如何检查属性的流利验证
- regex - 在匹配正则表达式中的确切单词时避免出现在字符串前后的特殊字符
- python - 如何以编程方式创建基于 django-imagekit 的内容实例?
- python - 烧瓶 WTForms 并使用 for 循环生成字段
- ios - 如何使用 Alamofire 的 RequestAdapter 将 firebase ID 令牌设置为全局标头?
- reactjs - 如何将 socket.on 方法绑定到 React 功能组件
- php - Laravel 路由映射问题:无法将 url 映射到控制器方法