Comment ajouter des attributs personnalisés aux modèles Laravel Eloquent en cours de chargement ?
Dans Laravel Eloquent, vous pouvez rencontrer un scénario dans lequel vous souhaitez ajouter un attribut personnalisé à un modèle lorsqu'il est chargé. Par exemple, considérons un contrôleur comme celui-ci :
<code class="php">public function index() { $sessions = EventSession::all(); foreach ($sessions as $i => $session) { $sessions[$i]->available = $session->getAvailability(); } return $sessions; }</code>
Il serait pratique d'ignorer la boucle manuelle et de remplir automatiquement l'attribut « disponible ».
Le problème
Le problème ici est que la méthode toArray() d'un modèle ignore les accesseurs qui ne correspondent pas aux colonnes de la table sous-jacente. Il s'agit d'une conception intentionnelle pour des raisons de performances.
La solution
Versions Laravel >= 8 :
Heureusement, il existe une manière élégante d'y parvenir en utilisant l'attribut classe :
<code class="php">class EventSession extends Eloquent { protected $table = 'sessions'; public function availability() { return new Attribute( get: fn () => $this->calculateAvailability() ); } }</code>
Versions Laravel < 8 :
Option 1 : Propriété Appends
Pour les versions inférieures à 8, vous pouvez utiliser la propriété $appends pour contrôler quels attributs sont inclus dans le fichier sérialisé. forme du modèle :
<code class="php">class EventSession extends Eloquent { protected $table = 'sessions'; protected $appends = array('availability'); public function getAvailabilityAttribute() { return $this->calculateAvailability(); } }<p><strong>Option 2 : Remplacer toArray() Méthode</strong></p> <p>Vous pouvez également remplacer la méthode toArray() et définir manuellement l'attribut :</p> <pre class="brush:php;toolbar:false"><code class="php">class Book extends Eloquent { protected $table = 'books'; public function toArray() { $array = parent::toArray(); $array['upper'] = $this->upper; return $array; } public function getUpperAttribute() { return strtoupper($this->title); } }</code>
Option 3 : boucler les attributs mutés
Si vous disposez de nombreux accesseurs personnalisés, vous pouvez les parcourir et les appliquer pendant sérialisation :
<code class="php">class Book extends Eloquent { protected $table = 'books'; public function toArray() { $array = parent::toArray(); foreach ($this->getMutatedAttributes() as $key) { if ( ! array_key_exists($key, $array)) { $array[$key] = $this->{$key}; } } return $array; } public function getUpperAttribute() { return strtoupper($this->title); } }</code>
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!