モデル内で更新されたときに関数がトリガーされない
P粉752826008
P粉752826008 2023-08-08 16:31:55
0
1
476
<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'=>$ite​​m->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>
P粉752826008
P粉752826008

全員に返信(1)
P粉165522886

クエリ ビルダー インスタンスまたはバッチ更新を使用する場合、1 行のみを操作してもイベント リスナーは起動しません

リーリー

これをトリガーするには、モデル インスタンスを使用する必要があります

リーリー

これは

と同等です リーリー

そして、モデルでの update() の呼び出しは、クエリ ビルダーでの update() の呼び出しとは異なることがわかります。

これらのイベントをトリガーするには、コードには static::updated(function (Model $model) { のように、操作するモデルのインスタンスが必要です。クエリが異なる場合は、たとえば Equipment: :where ('id','>',$id)、すべてのイベントを処理するには、影響を受けるすべての行をクエリし、それらのモデル インスタンスを生成し、これらのモデルを使用してイベントを呼び出す必要があります。これによりパフォーマンスが低下します

ただし、他に方法がない場合は、明示的に行うことができます

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!