Laravel 5.1:处理具有相同列名的连接

Posted

技术标签:

【中文标题】Laravel 5.1:处理具有相同列名的连接【英文标题】:Laravel 5.1: handle joins with same column names 【发布时间】:2016-02-03 00:46:18 【问题描述】:

我正在尝试从数据库中获取以下内容:

用户名 用户头像名称 用户头像文件类型 完成对话消息

使用以下查询:

    static public function getConversation($id)

    $conversation = DB::table('conversation_messages')
        ->where('belongsTo', $id)
        ->join('users', 'conversation_messages.sender', '=', 'users.id')
        ->join('user_avatars', 'conversation_messages.sender', '=', 'user_avatars.id')
        ->select('users.name', 'conversation_messages.*', 'user_avatars.name', 'user_avatars.filetype')
        ->get();
    return $conversation;

到目前为止它工作正常,但头像的列名是“name”,就像“users”表中的列名一样。 因此,如果我使用此查询通过$conversation->name 获取输出,avatar.name 将覆盖users.name

有没有办法像 laravel 5.1 中的 mysql "as" 功能一样重命名查询输出?

例如:

$conversation->avatarName

$conversation->userName

【问题讨论】:

【参考方案1】:

我遇到了以下问题,简化示例:

$result = Donation::join('user', 'user.id', '=', 'donation.user_id')->where('user.email', 'hello@papabello.com')->first();

$resultDonation 模型的集合。但要小心:

两个表都有一个“created_at”列。现在在执行 $result->created_at 时会显示哪个 created_at ?我不知道。似乎 eloquent 在进行连接时正在执行隐式 select *,返回模型 Donation 但具有附加属性。 created_at 似乎是随机的。所以我真正想要的是返回用户的所有Donation 模型和电子邮件hello@papabello.com

解决办法是这样的:

$result = Donation::select('donation.*')->join('user', 'user.id', '=', 'donation.user_id')->where('user.email', 'hello@papabello.com')->first();

【讨论】:

【参考方案2】:

看看这个尝试加入三个表的示例,员工、客户和预订(数据透视表)。

 $bookings = \DB::table('bookings')
        ->join('staffs', 'staffs.id' , '=', 'bookings.staff_id')
        ->join('customers', 'customers.id' , '=', 'bookings.customer_id')
        ->select('bookings.id', 'bookings.start_time',  'bookings.end_time', 'bookings.service', 'staffs.name as Staff-Name',  'customers.name as Customer-Name')
        ->orderBy('customers.name', 'desc')
        ->get();
    return view('booking.index')
            ->with('bookings', $bookings);

【讨论】:

【参考方案3】:

是的,只需重命名任一表上的列即可。 您还可以做的是,将 user.name 列重命名为任何内容,还将 conversation_messages 的 sender 列重命名为 id 并执行自然连接。

【讨论】:

是的,这也是我的第一个想法。但是想想,一致的命名是每个数据库的一个很好的特性。检查我自己的答案:我找到了一个更好的解决方案。 :) 在您的答案中添加代码和示例,使其对最终用户更具可读性和可用性。仅仅输入一堆文字就很难看清你在说什么。【参考方案4】:

嗯好吧..我找到了一个简单的解决方案here

->select('users.name as userName', 'conversation_messages.*', 'user_avatars.name as avatarName', 'user_avatars.filetype')

正如你所提到的,我在 table.columnName 旁边添加了请求的“as-Feature”

【讨论】:

漂亮的解决方案而且非常有用,因此您不会得到一堆不需要的数据。在您发布此内容 4 年后仍然相关。 我们如何使用'selectRaw()'选择相同的? 漂亮而直接。

以上是关于Laravel 5.1:处理具有相同列名的连接的主要内容,如果未能解决你的问题,请参考以下文章

JOOQ 连接两个具有相同列名的表

内连接2个具有相同列名的表

PHP MySQL内部连接具有相同的列名[重复]

java - 如何在java中组合(连接)具有相同列名的两个数据框

具有相同列名的命名查询内部连接表的重复数据/值

当两个表具有相同的 dist 和 sort 键,但列名不同时,Redshift 是不是执行合并连接?