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 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《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')
                ]);
4年前 评论
讨论数量: 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')
                ]);
4年前 评论

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