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!