mysql - Eloquent 查询构建复杂查询以获取在同一表的 2 个不同列中搜索 ID 的唯一记录

标签 mysql laravel-4 eloquent

我正在将一个项目迁移到 Laravel 4,但我遇到了一个相当复杂的查询,我想将其迁移到正确的 Eloquent 查询中。

我有一个包含聊天消息的表,名为 chat_messages ,带有表示模型 Chatmessage

该表包含一个发送者列和一个接收者列,其中的用户 ID 链接到 users 表和 User 模型。

在旧版本应用程序上使用原始 SQL 获取包含所有聊天伙伴的所有用户 ID 的列表的查询如下:

$sql_allChatPartners = "SELECT DISTINCT chatPartner   
FROM ( SELECT * FROM (
    SELECT cm_receipient AS chatPartner, cm_sent_at
    FROM chat_messages WHERE cm_sender = '".$me->userID."'
    UNION
    SELECT cm_sender AS chatPartner, cm_sent_at
    FROM chat_messages WHERE cm_receipient = '".$me->userID."'
) whateva ORDER BY whateva.cm_sent_at DESC ) other";

很抱歉将“假”表命名为whateva和其他:-)

有人能给我正确的方向来使用 Eloquent Querybuilder 执行此操作吗?

重要的是,我必须以正确的顺序获取 chatPartner ID 列表,其中最后一条聊天消息已作为第一个 chatPartner 进行交换。聊天中不活动时间最长的聊天伙伴作为最后一个条目。

这是我迄今为止在用户模型中得到的......

public function allopenchats(){
 $asSender = Chatmessage::where('sender', $this->id)->select('receipient as chatPartner, created_at');
 $asBoth = Chatmessage::where('receipient', $this->id)->select('sender as chatPartner, created_at')
              ->union($asSender)->orderBy('created_at', 'desc')->get();
}

我将列 cm_receipient 重命名为 receipient,将 cm_sender 重命名为 sendersent_at > 到新版本的新数据库中的created_at

非常感谢您的帮助!

最佳答案

您的sql可能会更改为:

    SELECT IF (cm_receipient = '10', cm_sender, IF (cm_sender = '10',cm_receipient, 'no')) AS chatPartner, cm_sent_at
FROM chat_messages
WHERE cm_receipient = '10' OR cm_sender = '10'
GROUP BY chatPartner
HAVING chatPartner != 'no'

按 cm_sent_at DESC 排序

正常情况下:

Chatmessage::where('sender','=',$this->id)
    ->orWhere('receipient','=',$this->id)
    ->select(DB::raw('IF (receipient = '.$this->id.', sender, IF (sender = '.$this->id.',receipient, 'no' )) AS chatPartner'), 'created_at')
    ->groupBy('chatPartner')
    ->having('chatPartner', '!=', 'no')
    ->orderBy('created_at', 'desc')
    ->get();

关于mysql - Eloquent 查询构建复杂查询以获取在同一表的 2 个不同列中搜索 ID 的唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28604940/

相关文章:

php - Laravel 5.2 定义自引用模型关系时使用原始查询?

MYSQL-Access-Macro Error 字段列表中的未知列

validation - 使用Laravel验证来验证 bool 值

orm - Laravel Eloquent 访问原文

php - 在过滤器未运行之前

laravel-5 - 删除 Eloquent 记录之间的关系

MySQL 如何在 where 子句的 AND 运算符中使用 and OR?

c# - 如何将数据网格记录添加到数据库?

c# - ASP.Net 无法找到 .Net Framework 提供程序

php - 如何使唯一数组的自定义验证规则依赖于其他字段 laravel