モデル内で更新されたときに関数がトリガーされない
P粉752826008
2023-08-08 16:31:55
<p>私にはこのようなモデルがあります:</p>
<pre class="brush:php;toolbar:false;">クラス機器はモデルを拡張します
{
HasFactory、softDeletes を使用します。
protected $table = '装備';
protected $fillable = ['station_id', 'parent_id', 'code', 'name', 'description', 'creator_id','deletor_id','updator_id'];
保護された $softDelete = true;
protected $dates = ['deleted_at'];
パブリック静的関数 boot()
{
親::ブート();
// まったく呼び出されません!
static::updated(function (Model $model) {
Log::error('refreshTree の呼び出し');
$model->refreshTree();
});
static::created(function (Model $model) {
$model->refreshTree();
});
static::deleted(function (Model $model) {
$model->refreshTree();
});
}
パブリック関数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) {
$tree = [];
foreach ($data を $item) {
if ($item->parent_id == $parentId) {
$children = $this->generateTree($data, $item->id);
$node = [
'id' => $item->id、
'テキスト' => $item->名前、
'editURL'=>route('dashboard.basic-info.equipments.edit',['id'=>$item->id]),
'子供たち' => $children
];
if(カウント($children) <= 0)
unset($node['children']);
array_push($tree, $node);
}
}
$tree を返します。
}
}</pre>
<p>現在私たちがモデルを構築しているとき、構築関数はトリガーされていますが、当私たちがモデルを更新しているとき、更新関数はトリガーされていません</p>
<pre class="brush:php;toolbar:false;">//Equipment::where('id',$id)->update(['parent_id'=>$recordTarget['id'] ]); //它没有生效
//我也尝试了这个:
$equipment = 機器::find($id);
$equipment->parent_id = $recordTarget['id'];
$equipment->save();</pre>
<p><br /></p>
クエリ ビルダー インスタンスまたはバッチ更新を使用する場合、1 行のみを操作してもイベント リスナーは起動しません
リーリーこれをトリガーするには、モデル インスタンスを使用する必要があります
リーリーこれは
と同等です リーリーそして、モデルでの update() の呼び出しは、クエリ ビルダーでの update() の呼び出しとは異なることがわかります。
これらのイベントをトリガーするには、コードには static::updated(function (Model $model) { のように、操作するモデルのインスタンスが必要です。クエリが異なる場合は、たとえば Equipment: :where ('id','>',$id)、すべてのイベントを処理するには、影響を受けるすべての行をクエリし、それらのモデル インスタンスを生成し、これらのモデルを使用してイベントを呼び出す必要があります。これによりパフォーマンスが低下します
ただし、他に方法がない場合は、明示的に行うことができます
リーリー