Php Laravel:当进行左连接时,如何创建字段别名,以便我可以访问同名字段
我有一张“主”桌,比如说:Php Laravel:当进行左连接时,如何创建字段别名,以便我可以访问同名字段,php,sql,laravel,Php,Sql,Laravel,我有一张“主”桌,比如说: id autoincrement name varchar(10) category integer $records = Master::where('category', '=', 1) ->leftJoin('detail', 'master.id', '=', 'detail.master_id') 然后我有一个“细节”表,比如说: id autoincrement master_id in
id autoincrement
name varchar(10)
category integer
$records = Master::where('category', '=', 1)
->leftJoin('detail', 'master.id', '=', 'detail.master_id')
然后我有一个“细节”表,比如说:
id autoincrement
master_id integer
qty integer
我想做一个左连接,如:
SELECT * FROM master
LEFT JOIN detail ON master.id = detail.master_id
WHERE category=1
这个查询生成的正是我在SQL中想要的:一个包含所有主记录的表,即使它们没有详细信息,在这种情况下,也会得到包含NULL的详细信息列,这是正确的
现在在拉威尔,我想做一些类似的事情:
id autoincrement
name varchar(10)
category integer
$records = Master::where('category', '=', 1)
->leftJoin('detail', 'master.id', '=', 'detail.master_id')
如果详细信息表为空,则它将id返回为NULL
我认为这是因为它返回两次id
,首先是master.id
,然后是来自detail表的第二个id
,当然是空的
那么,如何为第一个(或第二个id)设置别名以访问它呢?您可以从主表中获取所有列,并在
选择中分别选择和别名所需的每个详细信息表列。您是对的,它会因为相同的名称而覆盖它们。所以试试这个:
$records = Master::where('category', '=', 1)
->select('master.*', 'detail.id as detail_id')
->leftJoin('detail', 'master.id', '=', 'detail.master_id')
请记住,这只会在结果中显示明细表ID以及所有主表列,您应该将明细表中的其他列添加为select
参数。非常感谢。我刚刚发现我可以使用->addSelect(['master.id as mid','name',…])
,但是你的*
看起来好多了!