我想将 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这样的东西,你可以使用这三种方法: joinleftJoinrightJoin。 我不知道你到底想做什么。试试这三种方法,看看是否有效

【讨论】:

是的,我尝试了各种join,但出现错误。我认为我的DB::RAW 声明有问题。无论如何感谢您的回复。 没问题!祝你好运!

以上是关于我想将 MySQL 查询转换为 Laravel Eloquent / Laravel ORM的主要内容,如果未能解决你的问题,请参考以下文章

我想将 SQL 查询转换为 Laravel eloquent

将 MySQL 查询转换为 Laravel 查询构建器代码

如何将此 MySQL 查询转换为 Laravel?

使用python将mySql查询结果转换为json

将 MySql 查询的结果转换为数组 [关闭]

sql查询到带有联合的laravel查询