Laravel关联模型如何同时查询主表及关联表指定字段?
Laravel关联查询:同时获取主表与关联表指定字段
你遇到的报错是因为with()属于预加载查询,它会先执行主表的查询,再单独执行关联表的查询,两者是独立的SQL语句。主查询只针对user_role_plans表,所以你在主查询的select里写roleInfo.is_active,数据库会认为这个列不存在。
以下是两种正确的实现方式:
方法一:使用预加载(with)指定关联字段
预加载时,需要在with()的闭包中定义关联表要查询的字段,同时主查询必须包含关联外键(否则Laravel无法匹配主模型和关联数据):
UserRolePlan::with(['roleInfo' => function ($query) { // 指定关联表要查询的字段,必须包含关联主键role_info_id $query->select('role_info_id', 'is_active'); }]) // 主查询选择需要的字段,必须包含外键role_info_id ->select('user_role_plan_id', 'role_info_id') ->get();
返回结果中,每个UserRolePlan实例会附带roleInfo属性,里面包含is_active字段。
方法二:使用模型结合join查询(平级返回字段)
如果你希望关联表字段和主表字段平级返回,可以直接用模型的join方法,和DB门面的写法类似,但返回的是模型实例:
UserRolePlan::join('role_infos', 'user_role_plans.role_info_id', '=', 'role_infos.role_info_id') ->select('user_role_plans.user_role_plan_id', 'role_infos.is_active') ->get();
如果主表和关联表有重名字段,记得给字段加别名,比如->select('user_role_plans.id as plan_id', 'role_infos.id as role_id')。
注意事项
- 预加载时,主查询必须包含关联外键(如
role_info_id),否则Laravel无法将预加载的关联数据绑定到对应的主模型上。 - 关联查询的
select中,关联表的字段要使用表名(如role_infos.is_active),不能使用关联方法名(如roleInfo.is_active)。
内容的提问来源于stack exchange,提问作者ashkufaraz
相关产品推荐
相关产品推荐

