Attributs personnalisés dans les modèles Laravel/Eloquent en chargement
Le défi se pose lorsque l'on tente d'ajouter des attributs personnalisés à un modèle Eloquent lorsqu'il est initialement chargé. Cela évite d’avoir à remplir manuellement les attributs à l’aide de boucles. Bien que les événements de modèle aient été explorés, ils n'ont pas donné les résultats souhaités.
Solution
Le problème sous-jacent provient de la méthode toArray() qui ignore les accesseurs ne correspondant pas directement à la base de données. colonnes du tableau. Cependant, Laravel propose une solution de contournement simple :
Laravel >= 8.0
Introduisez une classe Attribute avec une fonction getter pour calculer l'attribut personnalisé :
<code class="php">class EventSession extends Eloquent { public function availability() { return new Attribute(get: fn () => $this->calculateAvailability()); } }</code>
Laravel < 8.0 et >= 4.08
Ajoutez l'attribut personnalisé à la propriété $appends et définissez l'accesseur getter :
<code class="php">class EventSession extends Eloquent { protected $appends = ['availability']; public function getAvailabilityAttribute() { return $this->calculateAvailability(); } }</code>
Laravel < 4.08
Remplacez la méthode toArray() pour définir explicitement l'attribut ou parcourez les attributs mutés pour récupérer leurs valeurs :
<code class="php">class EventSession extends Eloquent { public function toArray() { $array = parent::toArray(); $array['availability'] = $this->availability; return $array; } }<p>ou</p> <pre class="brush:php;toolbar:false"><code class="php">class EventSession extends Eloquent { public function toArray() { $array = parent::toArray(); foreach ($this->getMutatedAttributes() as $key) { $array[$key] = $this->$key; } return $array; } }</code>
En mettant en œuvre ces solutions, des attributs personnalisés peuvent être facilement ajoutés aux modèles Eloquent lors du chargement, éliminant ainsi le besoin de remplissage manuel des attributs.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!