Maison >développement back-end >tutoriel php >Comment ajouter un attribut personnalisé à un modèle Laravel/Eloquent lors du chargement ?

Comment ajouter un attribut personnalisé à un modèle Laravel/Eloquent lors du chargement ?

Barbara Streisand
Barbara Streisandoriginal
2024-11-04 13:15:29506parcourir

How to Add a Custom Attribute to a Laravel/Eloquent Model on Load?

Ajouter un attribut personnalisé à un modèle Laravel/Eloquent lors du chargement

Analyse du problème

Dans Laravel/Eloquent, les attributs personnalisés non directement liés à un Les colonnes de la table sous-jacente sont exclues lors de la conversion de modèles au format toArray() ou JSON.

Solution

Laravel 8 et supérieur :

Utilisez le Classe d'attribut pour créer un accesseur personnalisé qui calcule et attribue automatiquement l'attribut lors du chargement de l'objet.

<code class="php">class EventSession extends Eloquent {
  public function availability() {
    return new Attribute(
      get: fn () => $this->calculateAvailability()
    );
  }
}</code>

Laravel 7 et versions antérieures :

Option 1 : Ajouter l'attribut à la propriété $appends

Ajoutez l'attribut personnalisé au tableau $appends et définissez un accesseur approprié.

<code class="php">class EventSession extends Eloquent {
  protected $appends = ['availability'];
  public function getAvailabilityAttribute() {
    return $this->calculateAvailability();
  }
}</code>

Option 2 : Remplacer toArray() Méthode

Remplacez la méthode toArray() et définissez ou parcourez explicitement les attributs personnalisés.

<code class="php">class Book extends Eloquent {
  public function toArray() {
    $array = parent::toArray();
    $array['upper'] = $this->upper;
    return $array;
  }
  public function getUpperAttribute() {
    return strtoupper($this->title);
  }
}</code>

Option 3 : boucler sur les attributs mutés

Parcourez les attributs mutés du modèle et appliquez-les au tableau toArray().

<code class="php">class Book extends Eloquent {
  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