Heim > Fragen und Antworten > Hauptteil
P粉1655228862023-08-09 09:30:12
当使用查询构建器实例或批量更新时,即使你只针对一行进行操作,事件监听器也不会触发
Equipment::where('id',$id) //right here you get a Builder instance ->update([]); //will not trigger the event listener as it is a mass update
要触发它,你需要使用模型实例
Equipment::where('id',$id)->first() //This returns a model instance ->update([]); //will trigger the event listener as it is a single instance update
这也等同于
$equipment = Equipment::find($id); $equipment->parent_id = ..; $equipment->save();
并且你可以看到,在模型上调用update()与在查询构建器上调用update()是不同的。
当你考虑到,要触发这些事件,代码需要一个模型的实例来与之一起工作,就像static::updated(function (Model $model) {那样。如果你的查询不同,例如Equipment::where('id','>',$id),为了处理所有事件,它需要查询所有受影响的行,为它们生成模型实例,然后使用这些模型调用事件。
这会降低性能
但是如果没有其他办法,你可以明确地这样做
$equipments = Equipment::where('id','>',$id)->get(); foreach ($equipments as $equipment) { $equipment->update(['parent_id'=>$recordTarget['id']]); }