Eloquent 查询构建复杂查询以获取在同一 table 的 2 个不同列中搜索 ID 的唯一记录
Eloquent query building complex query to get unique records searching for an ID in 2 different columns in same table
我正在将一个项目迁移到 Laravel 4,但我遇到了一个非常复杂的查询,我想将其迁移到适当的 Eloquent 查询中。
我有一个包含聊天消息的 table,名为 chat_messages
,代表模型 Chatmessage
table 包含发件人和收件人列,用户 ID 链接到 users
table 和 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";
很抱歉命名 "fake" tables whateva 和其他 :-)
谁能告诉我用 Eloquent Querybuilder 做这件事的正确方向?
重要的是我以正确的顺序获取 chatPartner ID 列表,其中最后一条聊天消息已作为第一个 chatPartner 交换。聊天中最长时间不活动的 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();
}
为了新版本
非常感谢您的帮助!
您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();
非常感谢Vitalik_74,没有他我不会走那么远。
现在是最终查询,虽然它不在 ORM 中,但它工作正常并为我提供了我需要的结果。
$result = DB::select("SELECT *
FROM (
SELECT IF( receipient = '".$this->id."', sender, IF( sender = '".$this->id."', receipient, 'no' ) ) AS chatPartner, created_at
FROM chatmessages
WHERE receipient = '".$this->id."'
OR sender = '".$this->id."'
HAVING chatPartner != 'no'
ORDER BY created_at DESC
)whateva
GROUP BY whateva.chatPartner
ORDER BY whateva.created_at DESC");
如果有人可以使用 Laravel 查询生成器执行此查询,我将很高兴看到。现在我先这样吧。
我正在将一个项目迁移到 Laravel 4,但我遇到了一个非常复杂的查询,我想将其迁移到适当的 Eloquent 查询中。
我有一个包含聊天消息的 table,名为 chat_messages
,代表模型 Chatmessage
table 包含发件人和收件人列,用户 ID 链接到 users
table 和 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";
很抱歉命名 "fake" tables whateva 和其他 :-)
谁能告诉我用 Eloquent Querybuilder 做这件事的正确方向?
重要的是我以正确的顺序获取 chatPartner ID 列表,其中最后一条聊天消息已作为第一个 chatPartner 交换。聊天中最长时间不活动的 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();
}
为了新版本
非常感谢您的帮助!
您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();
非常感谢Vitalik_74,没有他我不会走那么远。 现在是最终查询,虽然它不在 ORM 中,但它工作正常并为我提供了我需要的结果。
$result = DB::select("SELECT *
FROM (
SELECT IF( receipient = '".$this->id."', sender, IF( sender = '".$this->id."', receipient, 'no' ) ) AS chatPartner, created_at
FROM chatmessages
WHERE receipient = '".$this->id."'
OR sender = '".$this->id."'
HAVING chatPartner != 'no'
ORDER BY created_at DESC
)whateva
GROUP BY whateva.chatPartner
ORDER BY whateva.created_at DESC");
如果有人可以使用 Laravel 查询生成器执行此查询,我将很高兴看到。现在我先这样吧。