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才能解决

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 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年前 评论

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