我想将 MySQL 查询转换为 Laravel Eloquent / Laravel ORM
Posted
技术标签:
【中文标题】我想将 MySQL 查询转换为 Laravel Eloquent / Laravel ORM【英文标题】:I want to covert MySQL query into Laravel Eloquent / Laravel ORM 【发布时间】:2021-12-29 22:34:40 【问题描述】:这是我的查询;
SELECT
*
FROM
`chats` chat
INNER JOIN(
SELECT MAX(`chats`.`id`) AS last_id
FROM
`chats`
WHERE
(`chats`.`receiver_id` = 1 OR `chats`.`sender_id` = 1)
GROUP BY
CONCAT(
LEAST(
`chats`.`receiver_id`,
`chats`.`sender_id`
),
'.',
GREATEST(
`chats`.`receiver_id`,
`chats`.`sender_id`
)
)
) conversations
ON
conversations.last_id = chat.id
ORDER BY
chat.created_at
DESC;
我已尝试转换此 mysql 查询。这是我目前所做的;
$query = Chat::query();
$total_records = $query->select("chats.*")
->innerJoin('chats', function($join) use ($loggin_user)
$join->on('chats.id', '=',DB::raw('( SELECT MAX(`chats`.`id`) AS last_id FROM `chats` WHERE (`chats`.`receiver_id` = '.$loggin_user.' OR `chats`.`sender_id` = '.$loggin_user.') GROUP BY CONCAT( LEAST( `chats`.`receiver_id`, `chats`.`sender_id` ), '.', GREATEST( `chats`.`receiver_id`, `chats`.`sender_id` ) ) )'))
->orderBy("chats.created_at", "DESC")->get()->toArray();
);
查询后在屏幕上显示此错误:
Errors Screenshot
我需要有人帮助将此查询转换为 Laravel。
【问题讨论】:
【参考方案1】:Laravel 确实提供了RAW 功能,您也可以在其中执行原始查询。
$query = DB::select("SELECT
*
FROM
`chats` chat
INNER JOIN(
SELECT MAX(`chats`.`id`) AS last_id
FROM
`chats`
WHERE
(`chats`.`receiver_id` = 1 OR `chats`.`sender_id` = 1)
GROUP BY
CONCAT(
LEAST(
`chats`.`receiver_id`,
`chats`.`sender_id`
),
'.',
GREATEST(
`chats`.`receiver_id`,
`chats`.`sender_id`
)
)
) conversations
ON
conversations.last_id = chat.id
ORDER BY
chat.created_at
DESC;");
我们仍然可以使用 Laravel 的语句命令
$query = DB::statement("SELECT
*
FROM
`chats` chat
INNER JOIN(
SELECT MAX(`chats`.`id`) AS last_id
FROM
`chats`
WHERE
(`chats`.`receiver_id` = 1 OR `chats`.`sender_id` = 1)
GROUP BY
CONCAT(
LEAST(
`chats`.`receiver_id`,
`chats`.`sender_id`
),
'.',
GREATEST(
`chats`.`receiver_id`,
`chats`.`sender_id`
)
)
) conversations
ON
conversations.last_id = chat.id
ORDER BY
chat.created_at
DESC;");
当您询问是否要对原始查询使用 get 函数时,您可以像这样修改您的查询:
DB::table('some_table')
->selectRaw('COUNT(*) AS result')
->get();
这将返回 php 对象的集合。
另外你也可以使用它:
DB::select(DB::raw("
SELECT COUNT(*) AS result
FROM some_table"
));
这将返回 Php 对象的数组。
【讨论】:
是的,我已经尝试过这两种 RAW 语句。两者都工作正常。但我想要数据库Model Object
,所以我可以调用->get()
、->toArray()
和->count()
函数。问题是使用 RAW 我无法调用这些 laravel 模型对象函数。【参考方案2】:
使用join
而不是innerJoin
。
eloquent中没有innerJoin这样的东西,你可以使用这三种方法:
join
、leftJoin
和 rightJoin
。
我不知道你到底想做什么。试试这三种方法,看看是否有效
【讨论】:
是的,我尝试了各种join
,但出现错误。我认为我的DB::RAW
声明有问题。无论如何感谢您的回复。
没问题!祝你好运!以上是关于我想将 MySQL 查询转换为 Laravel Eloquent / Laravel ORM的主要内容,如果未能解决你的问题,请参考以下文章