我有一个复杂的请求,我希望使用Eloquent ORM或使用Query Builder为Laravel网站进行翻译,但我不能这样做,特别是因为INNER JOIN和FROM上的双重名称
这是我的SQL请求
SELECT u.name,
u.photo,
m.*
FROM users u
INNER JOIN messages m ON u.id = m.useridsend
INNER JOIN (
SELECT useridsend,
MAX(created_at) AS created_at
FROM messages
GROUP BY useridsend
) r ON m.useridsend = r.useridsend
AND m.created_at = r.created_at
WHERE m.useridreceive=2
ORDER BY m.created_at DESC;
答案 0 :(得分:1)
这是我尝试使用Raw Expressions查询Eloquent语法。请记住,这可能不正确,因为我还没有对它进行测试,而你使用速记会让它变得笨拙。您的代码中需要大量原始查询,我假设AND
语句用于内连接:
DB::selectRaw("u.name, u.photo, m.* from users u")
->joinRaw("messages m ON u.id = m.useridsend")
->joinRaw("(SELECT useridsend,
MAX(created_at) AS created_at
FROM messages
GROUP BY useridsend)
r ON m.useridsend = r.useridsend
AND m.created_at = r.created_at")
->whereRaw("m.useridreceive=2")
->orderBy('m.created_at', 'DESC')
->get();
就像我说的那样,它可能不是100%正确,但我希望你能够了解如何使用raw
查询。使用较少的表的简写名称也可以更容易地使用标准的Eloquent代码。
修改
另外,利用模型可以不简化这个吗?您似乎正在尝试将所有消息发送给用户。通过定义用户模型以及消息模型,您可以利用某些Eager Loading技术并使用类似
的内容User::where('id', '=', '2')->with('messages')->get();