Eloquent关联预加载使用select后返回空数组的原因及解决方法
问题产生原因
- Eloquent 关联预加载依赖关联键完成父子模型的匹配:你定义的
codes关联本质是父模型通过自身主键,关联codes表的对应外键字段,你在闭包中仅执行select('code'),没有查询该关联外键,Eloquent 无法将查询到的codes记录匹配到对应的父模型上,就会返回空结果。 codes下嵌套的子关联(codes.status/codes.company/codes.item.serials等)的预加载依赖codes表的主键:这些子关联都是以codes表的主键作为关联键查询的,你没有查询codes的主键,即使父关联匹配成功,后续子关联也无法完成数据匹配。
修复方案
只需要在select语句中把关联需要的外键、主键都加入查询字段即可,示例如下(请将字段替换为你实际表中的关联字段):
$model::query() ->with([ 'codes' => function ($query) { // 依次为codes表主键、codes关联父模型的外键、你需要的业务字段code $query->select('id', 'parent_model_id', 'code'); }, 'codes.status', 'codes.company', 'codes.type', 'codes.item.serials', ])->get();
- 如果你后续需要给
codes的子关联也加select字段限制,同样要注意带上子关联对应的关联键,比如给codes.item加select时,需要带上item表关联codes的外键,以及item自身的主键(用于加载item.serials关联)。
内容的提问来源于stack exchange,提问作者zyyyzzz
相关产品推荐
相关产品推荐

