Heim  >  Artikel  >  Backend-Entwicklung  >  Wie füge ich beim Laden ein benutzerdefiniertes Attribut zu einem Laravel/Eloquent-Modell hinzu?

Wie füge ich beim Laden ein benutzerdefiniertes Attribut zu einem Laravel/Eloquent-Modell hinzu?

Barbara Streisand
Barbara StreisandOriginal
2024-11-04 13:15:29446Durchsuche

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

Hinzufügen eines benutzerdefinierten Attributs zu einem Laravel/Eloquent-Modell beim Laden

Problemanalyse

In Laravel/Eloquent beziehen sich benutzerdefinierte Attribute nicht direkt auf a Spalte in der zugrunde liegenden Tabelle werden beim Konvertieren von Modellen in das toArray()- oder JSON-Format ausgeschlossen.

Lösung

Laravel 8 und höher:

Verwenden Sie die Attributklasse zum Erstellen eines benutzerdefinierten Accessors, der das Attribut automatisch berechnet und zuweist, wenn das Objekt geladen wird.

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

Laravel 7 und niedriger:

Option 1 : Attribut an die Eigenschaft „$appends“ anhängen

Fügen Sie das benutzerdefinierte Attribut zum Array „$appends“ hinzu und definieren Sie einen geeigneten Accessor.

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

Option 2: Überschreiben Sie toArray() Methode

Überschreiben Sie die toArray()-Methode und legen Sie die benutzerdefinierten Attribute explizit fest oder iterieren Sie darüber.

<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: Schleife durch mutierte Attribute

Durchlaufen Sie die mutierten Attribute des Modells und wenden Sie sie auf das toArray()-Array an.

<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>

Das obige ist der detaillierte Inhalt vonWie füge ich beim Laden ein benutzerdefiniertes Attribut zu einem Laravel/Eloquent-Modell hinzu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn