laravel中update如何使用子查询?

sql代码:

UPDATE cy_customer
INNER JOIN (
    SELECT
        customer_id,
    CASE

            WHEN MOD ( row_number() OVER ( ORDER BY id ), 3 ) = 0 THEN
            1 
            WHEN MOD ( row_number() OVER ( ORDER BY id ), 3 ) = 1 THEN
            2 
            WHEN MOD ( row_number() OVER ( ORDER BY id ), 3 ) = 2 THEN
            3 
        END AS ascription 
    FROM
        cy_customer_group_details 
    WHERE
        customer_group_id = 5 
    ) AS cy_customer_group_details ON cy_customer.id = cy_customer_group_details.customer_id 
    SET cy_customer.ascription = cy_customer_group_details.ascription

子查询是动态生成的,感觉这边只能用raw+动态生成sql才能解决

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

自问自答,这边可以通过joinSub来实现,代码如下:

            // 交替分配算法
            $selectRaw = 'CASE ';
            foreach ($users as $key => $user) {
                $selectRaw .= "WHEN MOD ( row_number() OVER ( ORDER BY created_at ), {$count} ) = {$key} THEN {$user} ";
            }
            $selectRaw .= 'END AS ascription';

            // 子查询
            $subQuery = DB::table('customer_group_details')
                ->select('customer_id')
                ->addSelect(DB::raw($selectRaw))
                ->where('customer_group_id', $customer_group_id);

            DB::table('customer')
                ->joinSub($subQuery, 'customer_group_details', function ($join) {
                    $join->on('customer.id', '=', 'customer_group_details.customer_id');
                })
                ->update([
                    'customer.ascription' => DB::raw('cy_customer_group_details.ascription')
                ]);
3年前 评论
讨论数量: 1

自问自答,这边可以通过joinSub来实现,代码如下:

            // 交替分配算法
            $selectRaw = 'CASE ';
            foreach ($users as $key => $user) {
                $selectRaw .= "WHEN MOD ( row_number() OVER ( ORDER BY created_at ), {$count} ) = {$key} THEN {$user} ";
            }
            $selectRaw .= 'END AS ascription';

            // 子查询
            $subQuery = DB::table('customer_group_details')
                ->select('customer_id')
                ->addSelect(DB::raw($selectRaw))
                ->where('customer_group_id', $customer_group_id);

            DB::table('customer')
                ->joinSub($subQuery, 'customer_group_details', function ($join) {
                    $join->on('customer.id', '=', 'customer_group_details.customer_id');
                })
                ->update([
                    'customer.ascription' => DB::raw('cy_customer_group_details.ascription')
                ]);
3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!