php 使用Eloquent在mysql中左连接后分别获取同名列

aurhwmvo  于 2023-04-28  发布在  PHP
关注(0)|答案(4)|浏览(107)

我有两张table,其中一张是商店的学生,另一张是经理
学生有名姓,最终经理也有
我还将**added_by* 存储在students表中,以检查哪个管理器添加了学生。
使用查询I连接表

$students = \App\Student::with('payment')->with('discontinuities')
                ->leftJoin('managers','students.added_by','=','managers.id')
                ->get();

假设学生是
姓名姓名添加人
Jon Doe 1
经理是
身份证名姓
1个无名女尸
因此,当我用上面给予的查询连接这两个表时。我的学生成为

Jane doe,因为这两个表中的名称冲突。

由于两个列的名称相同,因此只需将管理员的名称覆盖到学生的名称。
我实际上可以只连接managers表中的一些列,但是我需要这个name列来打印出带有managers名称的added_by列,当然我可以将表中的列名更改为其他内容,但是这将是太多的工作,因为我必须逐个重构应用程序中的每个查询,并且从头开始测试所有内容
所以我问题是如何连接这两个表并防止同名列的冲突?

fkaflof6

fkaflof61#

请尝试使用此:

$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_namesurname列将被视为m_s_name

lrpiutwd

lrpiutwd2#

我今天早些时候遇到了一个类似的问题,'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']);
whitzsjs

whitzsjs3#

我的猜测是,您应该在查询的get()部分指定列名和表。
例如:

$students = \App\Student::with('payment')->with('discontinuities')
    ->leftJoin('managers','students.added_by','=','managers.id')
    ->get(['managers.Name', 'managers.Surname', 'students.name', 'students.surname']);
4szc88ey

4szc88ey4#

多年以后。我在google上搜索的时候发现了这个
要使查询采用初始表列而不是连接的表列。假设连接的表有一个别名't_alias',初始表名为'table_name',在连接后添加一行:

$builder->addSelect('t_alias.*')->addSelect('table_name.*');

这应该可以防止超控。
注意:如果需要,切换这些指令将反转效果。

相关问题