将SQL请求转换为Laravel

时间:2014-06-05 08:42:01

标签: sql laravel eloquent translate query-builder

我有一个复杂的请求,我希望使用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;

1 个答案:

答案 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();