Heim  >  Artikel  >  Backend-Entwicklung  >  Wie füge ich beim Laden benutzerdefinierte Attribute zu Laravel/Eloquent-Modellen hinzu?

Wie füge ich beim Laden benutzerdefinierte Attribute zu Laravel/Eloquent-Modellen hinzu?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-04 05:41:29555Durchsuche

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

Benutzerdefinierte Attribute in Laravel/Eloquent-Modellen beim Laden

Die Herausforderung entsteht, wenn versucht wird, benutzerdefinierte Attribute zu einem eloquenten Modell hinzuzufügen, wenn es zum ersten Mal geladen wird geladen. Dadurch entfällt die Notwendigkeit einer manuellen Attributauffüllung mithilfe von Schleifen. Obwohl Modellereignisse untersucht wurden, haben sie nicht zu den gewünschten Ergebnissen geführt.

Lösung

Das zugrunde liegende Problem rührt von der toArray()-Methode her, die Zugriffsmethoden außer Acht lässt, die nicht direkt der Datenbank entsprechen Tabellenspalten. Laravel bietet jedoch eine einfache Problemumgehung:

Laravel >= 8.0

Führen Sie eine Attributklasse mit einer Getter-Funktion ein, um das benutzerdefinierte Attribut zu berechnen:

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

Laravel < 8.0 und >= 4.08

Fügen Sie das benutzerdefinierte Attribut zur Eigenschaft $appends hinzu und definieren Sie den Getter-Accessor:

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

Laravel < 4.08

Überschreiben Sie die toArray()-Methode, um das Attribut explizit festzulegen, oder durchlaufen Sie mutierte Attribute, um ihre Werte abzurufen:

<code class="php">class EventSession extends Eloquent {
    public function toArray()
    {
        $array = parent::toArray();
        $array['availability'] = $this->availability;
        return $array;
    }
}<p>oder</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>

Durch die Implementierung dieser Lösungen können benutzerdefinierte Attribute beim Laden problemlos zu Eloquent-Modellen hinzugefügt werden, sodass keine manuelle Attributauffüllung erforderlich ist.

Das obige ist der detaillierte Inhalt vonWie füge ich beim Laden benutzerdefinierte Attribute zu Laravel/Eloquent-Modellen 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