Laravel关联查询优化:如何仅返回指定字段及关联模型字段?
Laravel Eloquent 关联模型指定字段查询解决方案
你遇到的是Laravel Eloquent关联查询里的常见误区,我来帮你梳理正确的实现方式:
正确的查询代码
$encuestas = Encuesta::with(['categoria' => function ($query) { // 指定关联模型要返回的字段,必须包含关联匹配用的主键id $query->select('id', 'nombre'); }]) // 主模型必须选择id、titulo,以及关联所需的外键categoria_id(否则Eloquent无法匹配关联数据) ->select('id', 'titulo', 'categoria_id') ->where('categoria_id', $id) ->get(); return $encuestas;
为什么你的两种写法无效?
- 第一种写法
select('id', 'titulo', 'categoria'):categoria是你定义的关联关系名称,并非encuestas表的物理字段,数据库会找不到这个字段导致查询报错。 - 第二种写法
select('id', 'titulo', 'categoria.nombre'):select方法默认仅针对主表(encuestas)查询,不能直接指定关联表的字段,关联表的字段需要在with的闭包中单独定义查询规则。
关键注意事项
- 主模型必须包含关联外键:必须选择
categoria_id,因为Eloquent需要用这个字段去匹配categoria表的id,否则关联的categoria数据会是空值。 - 关联模型必须包含主键:在
categoria的查询中必须选择id,否则Eloquent无法将主模型的categoria_id与关联模型匹配,导致关联数据无法加载。
这样返回的结果就只会包含encuestas的id、titulo,以及categoria的nombre字段了。
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

