Laravel新手求助:如何正确使用createMany批量插入数据?
正确使用Laravel的createMany()实现批量数据插入
一、createMany()的运作逻辑
createMany()是Eloquent模型提供的批量创建方法,接收二维关联数组作为参数,每个子数组对应一条数据库记录的字段数据- 内部会遍历数组中的每一项,自动处理模型的
$fillable批量赋值白名单,循环调用create()方法完成数据插入 - 注意:该方法会触发模型的
creating、created等事件,但本质是多次执行插入SQL,而非单条SQL批量插入(若需单条SQL批量插入,用insert()方法,但不会触发模型事件)
二、你的代码存在的问题
- 验证规则不完善:
products和amount是数组类型,当前仅验证required,未指定array规则,也未校验两个数组长度是否一致,容易出现索引越界 - 变量未初始化:
$values未提前声明,严格模式下会报错 - 调试代码阻断执行:
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
相关产品推荐
相关产品推荐

