Laravel 5.2关联查询仅选取指定字段失效问题排查
解决Laravel 5.2关联查询指定字段返回null的问题
这个坑我当初刚用Laravel的时候也踩过!问题出在你忽略了关联查询的一个核心逻辑:Laravel需要通过**关联字段(主键/外键)**来把主模型和关联模型绑定起来,如果你只选了name,它找不到匹配的关联标识,自然就返回null了。
原因分析
当你使用with()闭包指定select(['name'])时,JobType模型的查询结果里没有包含它的主键(默认是id),而Job模型是通过自身的外键(比如job_type_id)去匹配JobType的id来建立关联的。没有这个id字段,Laravel没法把查询到的JobType数据和对应的Job关联起来,所以关联属性就变成了null。
正确写法
你只需要在select里加上关联所需的主键字段就行,比如:
$job = Job::query()->whereId($job_id)->with([ 'jobType' => function (Relation $query) { $query->select(['id', 'name']); // 必须包含JobType的主键id }, ])->first();
如果你的关联使用了自定义外键(比如Job模型里的关联是belongsTo(JobType::class, 'type_id')),那也要确保JobType的查询结果里包含这个外键对应的字段(一般还是id,除非你改了JobType的主键名)。
另外Laravel 5.2还支持更简洁的写法,直接在关联名称后面用冒号指定字段:
$job = Job::query()->whereId($job_id)->with('jobType:id,name')->first();
这样写效果是一样的,代码更清爽。
总结
关联查询指定字段时,一定要包含关联匹配所需的主键/外键字段,这是Laravel关联模型绑定的必要条件,漏掉它就会导致关联数据无法正确加载。
内容的提问来源于stack exchange,提问作者Eem Jee
相关产品推荐
相关产品推荐

