Heim > Backend-Entwicklung > PHP-Tutorial > 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
Freigeben: 2024-11-04 05:41:29
Original
561 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage