La fonction n'est pas déclenchée lors de la mise à jour à l'intérieur du modèle
P粉752826008
P粉752826008 2023-08-08 16:31:55
0
1
473
<p>我有一个像这样的模型:</p> <pre class="brush:php;toolbar:false;">class Equipment étend le modèle { utilisez HasFactory, softDeletes ; protected $table = 'équipements'; protected $fillable = ['station_id', 'parent_id', 'code', 'name', 'description', 'creator_id', 'deletor_id', 'updator_id']; protégé $softDelete = true ; dates protégées $ = ['deleted_at']; fonction statique publique boot() { parent::boot(); //ça n'appelle pas du tout ! static::mis à jour(fonction (Modèle $model) { Log::error('appel de rafraîchissementTree'); $model->refreshTree(); }); static::created(function (Modèle $model) { $model->refreshTree(); }); static::deleted(function (Modèle $model) { $model->refreshTree(); }); } fonction publique rafraîchirTree(){ Log::erreur('refreshTree'); $équipement = DB::table('équipements')->get(); $treeData = $this->generateTree($equipment); $jsonData = json_encode($treeData); Redis::set(config('redis.EquipmentTree'),$jsonData); } fonction privée generateTree($data, $parentId = 0) { $arbre = []; foreach ($données en tant que $item) { if ($item->parent_id == $parentId) { $children = $this->generateTree($data, $item->id); $nœud = [ 'identifiant' => $item->id, 'texte' => $élément->nom, 'editURL'=>route('dashboard.basic-info.equipments.edit',['id'=>$item->id]), 'enfants' => $enfants ]; si(count($enfants) <= 0) unset($node['enfants']); array_push($arbre, $node); } } renvoie $arbre ; } }</pré> <p> <pre class="brush:php;toolbar:false;">//Equipment::where('id',$id)->update(['parent_id'=>$recordTarget['id'] ]); //它没有生效 //我也尝试了这个 : $equipment = Equipment::find($id); $equipment->parent_id = $recordTarget['id']; $equipment->save();</pre> <p><br /></p>
P粉752826008
P粉752826008

répondre à tous(1)
P粉165522886

Lors de l'utilisation d'une instance du générateur de requêtes ou d'une mise à jour par lots, l'écouteur d'événements ne se déclenchera pas même si vous n'opérez que sur une seule ligne

Equipment::where('id',$id) //right here you get a Builder instance
    ->update([]); //will not trigger the event listener as it is a mass update

Pour le déclencher, vous devez utiliser une instance de modèle

Equipment::where('id',$id)->first() //This returns a model instance
    ->update([]); //will trigger the event listener as it is a single instance update

C'est aussi équivalent à

$equipment = Equipment::find($id);
$equipment->parent_id = ..;
$equipment->save();

Et vous pouvez voir que l'appel de update() sur le modèle est différent de l'appel de update() sur le générateur de requêtes.

Lorsque vous considérez que, pour déclencher ces événements, le code a besoin d'une instance du modèle avec laquelle fonctionner, comme static::updated(function (Model $model) {. Si votre requête est différente, comme Equipment::where ( 'id','>',$id), afin de gérer tous les événements, il doit interroger toutes les lignes concernées, générer des instances de modèle pour elles, puis utiliser ces modèles pour appeler l'événement

Cela réduira les performances

Mais s'il n'y a pas d'autre moyen, vous pouvez le faire explicitement

$equipments = Equipment::where('id','>',$id)->get();
foreach ($equipments as $equipment) {
    $equipment->update(['parent_id'=>$recordTarget['id']]);
}
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!