如何使用关系批量更新数据

Consultant 模型:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Consultant extends Model
{
    /**
     * 获取顾问订单数据
     */
    public function orders()
    {
        return $this->hasMany('App\Order');
    }
}

创建订单(这里使用createMany批量插入数据是正常的)

        $consultant = Consultant::create($request->formData());
        // 开单
        $orders = $request->orderData([
            'customer_id' => $consultant->customer_id
        ]);
        $consultant->orders()->createMany($orders);

更新订单(这里saveMany,发现不是批量更新,而是批量插入)

        $consultant = Consultant::find($request->id);
        $data       = [];

        // 获取前端修改的数据
        $orders = collect($this->input('order'))->filter(function($item){
            return isset($item['id']) && $item['status'] == 4;
        });

        foreach ($orders as $order) {
            $data[] = new Order([
                'id'             => $order['id'],
                'reception_id'   => $order['reception_id'],
                'customer_id'    => $order['customer_id'],
                'status'         => 2,
                'type'           => $order['type'],
                'package_id'     => $order['package_id'] ?? null,
                'package_name'   => $order['package_name'] ?? null,
                'product_id'     => $order['product_id'] ?? null,
                'product_name'   => $order['product_name'] ?? null,
                'goods_id'       => $order['goods_id'] ?? null,
                'goods_name'     => $order['goods_name'] ?? null,
                'times'          => $order['times'],
                'unit_id'        => $order['unit_id'] ?? null,
                'specs'          => $order['specs'] ?? null,
                'price'          => $order['price'],
                'payable'        => $order['payable'],
                'amount'         => 0,
                'department_id'  => $order['department_id'],
                'salesman'       => $order['salesman'],
                'remark'         => $order['remark'] ?? null,
                'user_id'        => user()->id,
            ]);
        }
        // 发现使用saveMany 最后生成的是insert into 的sql语句
        $consultant->orders()->saveMany($data);
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

$consultant->orders()->delete();
$consultant->orders()->saveMany($data);

4年前 评论
讨论数量: 4

$consultant->orders()->sync($data);

4年前 评论

$consultant->orders()->delete();
$consultant->orders()->saveMany($data);

4年前 评论

@迷离 这个不能删掉,因为$consultant->orders里面,有些订单是成交了的。这次修改的是未成交,重新提交过来的数据

4年前 评论
迷离 4年前
迷离 4年前
chinatang (作者) (楼主) 4年前

@chinatang 请问楼主你是怎么解决这个问题的?

4年前 评论

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