Laravel 8.12中如何从关联模型获取指定列?
解决方案:在Laravel 8中指定嵌套关联的查询字段
要在嵌套关联中仅获取指定字段,核心是必须包含关联关系所需的主键和外键,否则Eloquent无法建立关联并返回数据。你之前尝试的person.localName:name写法无效,就是因为缺少了关联必需的键字段。
正确写法示例
你可以通过两种方式实现:
方式1:简洁的冒号分隔格式
直接在关联名后用冒号指定字段,但必须包含关联的主键和外键:
$group = MatchOfficial::with([ "role", // 注意:每个关联都要包含必要的主键/外键,否则关联数据无法匹配 "match:id,facility_id", // 需包含match的id和关联facility的外键facility_id "match.facility:id,local_name_id,location_id", // 包含facility的id、关联localName和location的外键 "match.facility.localName:id,facility_id,name", // 包含localName的id、关联facility的外键,加上需要的name字段 "match.facility.location:id,facility_id", // 同理包含必要键 "person:id,user_id", // 包含person的id、关联users的外键 "person.users:id,person_id", // 包含users的id、关联person的外键 "person.localName:id,person_id,name", // 这里就是你需要的:包含localName的id、关联person的外键,加上name "person.location:id,person_id", // 包含必要键 ])->when($person, function ($query) use ($person) { $query->where("person_id", $person); }) ->get() ->groupBy("person_id");
方式2:闭包自定义查询(适合复杂场景)
如果需要对关联添加额外条件,可使用闭包:
$group = MatchOfficial::with([ "role", "match" => function($query) { $query->select('id', 'facility_id'); // 选择match的必要字段 }, "match.facility.localName" => function($query) { $query->select('id', 'facility_id', 'name'); // 指定localName的字段,包含必要键 }, "person.localName" => function($query) { $query->select('id', 'person_id', 'name'); // 仅获取localName的name字段,同时保留关联必需的键 }, // 其他关联按同样方式处理 ])->when($person, function ($query) use ($person) { $query->where("person_id", $person); }) ->get() ->groupBy("person_id");
关键注意事项
- 无论哪种写法,必须包含关联模型的主键和关联外键:比如
person.localName关联中,localName表需要包含主键id和关联person的外键person_id,否则Eloquent无法将localName数据匹配到对应的person模型上,最终返回空的关联数据。 - 如果不需要主模型的所有字段,也可以在
get()方法中指定MatchOfficial本身的字段,比如get(['id', 'person_id', ...])。
内容的提问来源于stack exchange,提问作者Gor Brutyan
相关产品推荐
相关产品推荐

