La fonction n'est pas déclenchée lors de la mise à jour à l'intérieur du modèle
P粉752826008
2023-08-08 16:31:55
<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>
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
Pour le déclencher, vous devez utiliser une instance de modèle
C'est aussi équivalent à
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