Laravel联表查询获取objectives.id返回media.id,如何用AS别名解决
原因
多表关联查询时,objectives、users、media三张表都存在名为id的同名字段,Laravel查询构造器默认会按关联顺序覆盖同名字段的返回值,因此后关联的media表的id会覆盖先查询的objectives表的id。
解决方案
通过select()方法显式指定需要查询的字段,对同名字段添加别名区分即可,修改后的代码示例:
$objectives = DB::table('objectives') ->select( 'objectives.*', 'objectives.id as objective_id', // 目标字段设置独立别名 'users.id as user_id', 'users.name as assigned_user_name', 'media.id as media_id', 'media.file_path as training_document_path' // 其余需要的字段按需添加,同名字段注意设置别名即可 ) ->join('users', 'objectives.assigned_id', '=', 'users.id') ->join('media', 'objectives.training_document_id', '=', 'media.model_id') ->where('objectives.assigned_id', '=', $assigned_id) ->where('media.model_type', '=', 'App\Models\TrainingDoc') ->distinct() ->get();
补充说明
- 视图中可以直接通过
objective_id获取原objectives.id的数值,不会再被其他表的同名字段覆盖 - Laravel的
distinct()方法本身不接收字段参数,如果你需要按objectives.id去重,也可以将distinct()替换为groupBy('objectives.id'),两种方式都可以达到去重效果,根据业务场景选择即可。
内容的提问来源于stack exchange,提问作者dastuk
相关产品推荐
相关产品推荐

