使用 Eloquent 在 mysql 中左连接后分别获取相同的命名列
Posted
技术标签:
【中文标题】使用 Eloquent 在 mysql 中左连接后分别获取相同的命名列【英文标题】:Get same named columns separately after left join in mysql using Eloquent 【发布时间】:2016-05-01 16:42:15 【问题描述】:我有 2 张桌子,其中一张存储学生,另一张存储经理
学生有姓氏, 最终管理者也有name和surname。
我还将 added_by 存储在学生表中,以检查哪个经理添加了学生。
通过查询我加入表格
$students = \App\Student::with('payment')->with('discontinuities')
->leftJoin('managers','students.added_by','=','managers.id')
->get();
假设学生是
姓氏Added_by
乔恩·多伊 1
经理是
身份证姓名姓氏
1 简·多伊
所以当我使用上面给出的查询加入这两个表时。我的学生变成了
Jane doe,因为这 2 个表中存在名称冲突。 由于两个列的名称相同,只需将经理的姓名覆盖到学生的姓名即可。
我实际上只能加入 manager 表中的一些列,但是我需要这个 name 列来打印出带有 manager 名称的 add_by 列 当然,我可以将列名更改为表中的其他名称,但这会做太多工作,因为我必须一个一个地重构我的应用程序中的每个查询,并且还要从头开始测试所有内容
所以我的问题是如何加入这 2 个表并防止同名列发生冲突?
【问题讨论】:
【参考方案1】:试试这个:
$students = \App\Student::with('payment')->with('discontinuities')
->leftJoin('managers','students.added_by','=','managers.id')
->select('students.*','managers.name as m_name','managers.surname as m_s_name','managers.other_column_if_needed','managers.another_column_if_needed')
->get();
这样您的managers
表的name
列将被视为m_name
和surname
列将被视为m_s_name
【讨论】:
哦,我不知道加入后我可以更改列名。谢谢【参考方案2】:我今天早些时候遇到了一个类似的问题,“get”方法接受了一个列名数组,您希望在结果中作为参数。因此,为了防止冲突,您必须为这些列提供一个别名,如下所示:
$students = \App\Student::with('payment')->with('discontinuities')
->Join('managers','students.added_by','=','managers.id')
->get(['students.*', 'managers.name as managers_name', 'managers.surname as managers_surname', 'managers.other_column_if_needed']);
【讨论】:
【参考方案3】:我的猜测是您应该在查询的get()
部分中指定列名和表。
示例:
$students = \App\Student::with('payment')->with('discontinuities')
->leftJoin('managers','students.added_by','=','managers.id')
->get(['managers.Name', 'managers.Surname', 'students.name', 'students.surname']);
【讨论】:
以上是关于使用 Eloquent 在 mysql 中左连接后分别获取相同的命名列的主要内容,如果未能解决你的问题,请参考以下文章
使用 Laravel Eloquent 连接同一服务器上不同数据库中的两个 MySQL 表
Laravel 6,MYSQL - 如何使用 Laravel Querybuilder 或 Model Eloquent 将子查询与 GroupBY 左连接?