Laravel 9 Eloquent with预加载关联指定字段返回空问题
问题原因
使用with方法预加载关联并自定义返回字段时关联结果为空,核心原因是Laravel 关联匹配逻辑依赖关联外键字段,你指定Post模型返回字段时漏掉了关联外键category_id。
Laravel 预加载关联的执行逻辑分两步:
- 先查询出主表(Category)指定字段的所有数据,提取所有主模型主键
id值 - 用这些主键值批量查询关联表(Post)的匹配数据,再通过Post表存储的外键
category_id和主模型主键做对应,把关联数据挂载到对应分类模型下
如果查询Post数据时没有返回category_id字段,框架找不到关联匹配依据,就无法把查询到的文章和对应分类绑定,最终返回空的关联数组。
正确实现方案
在指定关联模型返回字段时,必须把关联外键字段加入查询列表,修改后代码如下:
$category = Category::select('id', 'name') ->with('post:id,title,category_id') ->get();
补充注意事项:
- 所有一对一、一对多关联,使用冒号语法快速指定关联字段时,都必须包含关联模型上的外键字段,否则会出现关联为空的问题
- 如果是多对多关联,除了关联模型自身的外键,还需要把中间表对应的关联键加入查询字段
- 如果关联逻辑比较复杂,也可以用闭包方式定义关联查询,可读性更强,示例代码如下:
$categories = Category::select('id', 'name') ->with(['post' => function ($postQuery) { $postQuery->select('id', 'title', 'category_id'); }]) ->get();
内容的提问来源于stack exchange,提问作者arthursousa
相关产品推荐
相关产品推荐

