多个 Laravel Eloquent 关系未显示来自所有关系的数据
Posted
技术标签:
【中文标题】多个 Laravel Eloquent 关系未显示来自所有关系的数据【英文标题】:Multiple Laravel Eloquent Relationship not showing data from all relationships 【发布时间】:2021-12-05 11:49:27 【问题描述】:我想从 Course 表中获取 id
和 courseName
,从 user
表中获取 id
,name
和 mob
以及从 id
表中获取 id
和 FilePath
,为此userId
当然表在user
表中具有id
的值,而fileId
在files
表中当然表具有id
的值。下面的代码不显示来自用户的任何数据模型,它显示null
为user
。非常感谢任何帮助。
课程表
Id | courseName | userId | fileId |
---|---|---|---|
Course::with('user:id,name,mob','files:id,FilePath')
->select ('id','courseName')
->get();
课程模型
public function files()
return $this->belongsTo(Uploads::class,'fileId','id');
public function user()
return $this->belongsTo(User::class,'userId','id');
【问题讨论】:
【参考方案1】:试试这个,让我知道它是否有效
Course::with([
'user' => function($q)
$q->select('id', 'name' , 'mob');
,
'files' => function($q)
$q->select('id', 'filePath');
])->get(['id','courseName']);
【讨论】:
它有效。但是因为我不想从课程表中选择所有列,所以我保留了 `->select ('id','courseName')` - 这也是。然后它再次将user
值显示为null
我怎样才能做到这一点?
@MerGeo 查看更新后的答案
结果是一样的。它为用户提供 null。
我又更新了,试试看。【参考方案2】:
让我解释一下 elquent 是如何“用”运行的
首先进行查询以获取您需要的所有课程 第二次为您需要的每个关系再次查询以获取它并将其添加到它的位置如果课程属于用户,您需要选择此关系的列,您必须加载 userId 以加载与 fileId 相同的用户数据
如果你像这样加载 userId 和 fileId,你的问题就会解决
Course::with('user:id,name,mob','files:id,FilePath')->get();
【讨论】:
或者你需要在课程中不加载 userId 或 fileId 的情况下,你必须使用 join 来建立这样的关系php Course::query() ->leftJoin('files','files.id','courses.fileId') ->leftJoin('users','users.id','courses.userId') ->select('courses.id','courses.courseName','files.filePath','users.name' , 'users.mob') ->get();
我复制了你在原始答案中给出的代码,但它也没有给我所需的结果。实际上,你提到它是两个步骤。你能给我你想要的所有代码行吗?【参考方案3】:
您混淆了user
关系的ownerKey 和foreignKey。尝试更新与此的关系
public function user()
return $this->belongsTo(User::class, 'userId', 'id');
【讨论】:
以上是关于多个 Laravel Eloquent 关系未显示来自所有关系的数据的主要内容,如果未能解决你的问题,请参考以下文章
未定义的属性:Illuminate\Database\Eloquent\Relations\BelongsTo::$status。 Laravel 5.5 关系
在 Laravel 中使用 Eloquent 多态关系对数据进行分类