You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 16:09:20