Laravel视图中如何访问join关联两表的同名id字段值
Laravel Join关联查询同名字段访问方案
关联两张存在同名字段(比如都有id)的表时,数据库返回的结果集同名字段会被后查询的表字段覆盖,直接访问会拿错值,最稳妥的解决方式是在查询阶段给重名字段设置别名,没有其他捷径。
具体实现
- 明确指定查询字段,给重名的
id设置专属别名
不要使用select('*')拉取全字段,手动指定需要的字段,把重名的id起别名做区分:
// 示例:关联文章表(posts)和用户表(users),两张表主键都为id $list = DB::table('posts') ->leftJoin('users', 'posts.user_id', '=', 'users.id') // posts表的字段正常取,users表的id起别名user_id,其他需要的字段依次列出 ->select('posts.*', 'users.id as user_id', 'users.name', 'users.avatar') ->get();
传到视图后直接通过别名访问对应表的id即可:
@foreach($list as $item) {{-- 访问posts表自身的id --}} <p>文章ID:{{ $item->id }}</p> {{-- 访问关联的users表的id --}} <p>作者ID:{{ $item->user_id }}</p> @endforeach
- 多同名字段批量处理
如果两张表除了id还有created_at、updated_at、deleted_at这类通用同名字段,可以用selectRaw统一给关联表的重名字段加前缀区分:
$list = DB::table('posts') ->leftJoin('users', 'posts.user_id', '=', 'users.id') ->selectRaw( 'posts.*, users.id as user_id, users.created_at as user_created_at, users.updated_at as user_updated_at' ) ->get();
注意:不要试图在结果返回后再区分同名字段,此时被覆盖的字段值已经丢失,没有办法从返回结果里找回,必须在构造查询语句时就通过别名做字段区分。
内容的提问来源于stack exchange,提问作者Hadem
相关产品推荐
相关产品推荐

