Maison >développement back-end >tutoriel php >Comment ajouter des attributs personnalisés aux modèles Laravel Eloquent lors du chargement ?

Comment ajouter des attributs personnalisés aux modèles Laravel Eloquent lors du chargement ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-01 07:41:30836parcourir

How to Add Custom Attributes to Laravel Eloquent Models on Load?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn