You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel新手求助:如何正确使用createMany批量插入数据?

正确使用Laravel的createMany()实现批量数据插入

一、createMany()的运作逻辑

  • createMany()是Eloquent模型提供的批量创建方法,接收二维关联数组作为参数,每个子数组对应一条数据库记录的字段数据
  • 内部会遍历数组中的每一项,自动处理模型的$fillable批量赋值白名单,循环调用create()方法完成数据插入
  • 注意:该方法会触发模型的creating、created等事件,但本质是多次执行插入SQL,而非单条SQL批量插入(若需单条SQL批量插入,用insert()方法,但不会触发模型事件)

二、你的代码存在的问题

  1. 验证规则不完善:products和amount是数组类型,当前仅验证required,未指定array规则,也未校验两个数组长度是否一致,容易出现索引越界
  2. 变量未初始化:$values未提前声明,严格模式下会报错
  3. 调试代码阻断执行:dd($values)会终止程序,导致后续的createMany()无法执行

三、修正后的完整代码

第一步:确保Order模型配置批量赋值白名单

class Order extends Model
{
    protected $fillable = [
        'order_number',
        'client',
        'products',
        'amount',
        'description'
    ];
}

第二步:修正控制器的store方法

public function store(Request $request)
{
    // 完善验证规则,确保数组类型及长度匹配
    $request->validate([
        'order_number' => 'required',
        'client' => 'required',
        'products' => 'required|array|min:1',
        'amount' => 'required|array|min:1|same:products', // same规则保证两个数组长度一致
        'description' => 'required',
    ]);

    // 提前初始化存储数据的数组
    $values = [];
    foreach ($request->products as $index => $product) {
        $values[] = [
            'order_number' => $request->order_number,
            'client' => $request->client,
            'products' => $product,
            'amount' => $request->amount[$index],
            'description' => $request->description,
        ];
    }

    // 执行批量创建
    Order::createMany($values);

    return redirect('/')->with('msg', 'Order Saved successfully!');
}

四、额外注意事项

  • 若插入数据量极大(如数百条以上),追求性能可使用Order::insert($values);,但该方法不会触发模型事件,且需手动添加created_at/updated_at字段(若模型启用时间戳)
  • 必须保证$fillable包含所有要插入的字段,否则会抛出批量赋值异常

内容的提问来源于stack exchange,提问作者laraCoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 10:40:36