【问题标题】:I want to covert MySQL query into Laravel Eloquent / Laravel ORM我想将 MySQL 查询转换为 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。

【问题讨论】:

    标签: php mysql laravel database eloquent


    【解决方案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 声明有问题。无论如何感谢您的回复。
    • 没问题!祝你好运!
    猜你喜欢
    • 2017-03-10
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多