class Equipment 擴充 Model { 使用 HasFactory、softDeletes; protected $table = '設備'; protected $fillable = ['station_id', 'parent_id', '代碼', '名稱', '描述', 'creator_id', 'deletor_id', 'updator_id']; 受保護的$softDelete = true; 受保護的$dates = ['deleted_at']; 公共靜態函數 boot() { 父::啟動(); //它根本沒有呼叫! 靜態::更新(函數(模型$模型){ Log::error('呼叫刷新樹'); $model->refreshTree(); }); 靜態::建立(函數(模型$模型){ $model->refreshTree(); }); 靜態::刪除(函數(模型$模型){ $model->refreshTree(); }); } 公共函數刷新樹(){ Log::error('refreshTree'); $equipment = DB::table('equipments')->get(); $treeData = $this->generateTree($equipment); $jsonData = json_encode($treeData); Redis::set(config('redis.EquipmentTree'),$jsonData); } 私有函式generateTree($data, $parentId = 0) { $樹= []; foreach($data 作為$item){ if ($item->parent_id == $parentId) { $children = $this->generateTree($data, $item->id); $節點= [ 'id'=> $item->id, '文本' => $項目->名稱, 'editURL'=>route('dashboard.basic-info.equipments.edit',['id'=>$item->id]), '孩子' => $兒童 ]; if(計數($children) <= 0) 取消設定($node['孩子']); array_push($tree, $node); } } 返回$樹; } }</pre> <p>當我建立模型時,建立函數被觸發,但是當我更新模型時,更新函數沒有被觸發//裝置::where('id',$id)->update(['parent_id'=>$recordTarget['id'] ]); // 沒有生效 //我也嘗試過這個: $設備=設備::find($id); $equipment->parent_id = $recordTarget['id']; $equipment->save();; <p><br />></p>
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']]); }