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

Patricia Arquette
Freigeben: 2024-11-01 07:41:30
Original
754 Leute haben es durchsucht

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

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

In Laravel Eloquent stoßen Sie möglicherweise auf ein Szenario, in dem Sie hinzufügen möchten ein benutzerdefiniertes Attribut für ein Modell, wenn es geladen wird. Stellen Sie sich zum Beispiel einen Controller wie diesen vor:

<code class="php">public function index()
{
    $sessions = EventSession::all();
    foreach ($sessions as $i => $session) {
        $sessions[$i]->available = $session->getAvailability();
    }
    return $sessions;
}</code>
Nach dem Login kopieren

Es wäre praktisch, die manuelle Schleife zu überspringen und das Attribut „verfügbar“ automatisch auszufüllen.

Das Problem

Das Problem hierbei ist, dass die toArray()-Methode eines Modells Zugriffsmethoden ignoriert, die nicht den Spalten in der zugrunde liegenden Tabelle entsprechen. Dies ist ein absichtliches Design aus Leistungsgründen.

Die Lösung

Laravel-Versionen >= 8:

Glücklicherweise Es gibt eine elegante Möglichkeit, dies mithilfe der Attribute-Klasse zu erreichen:

<code class="php">class EventSession extends Eloquent {

    protected $table = 'sessions';

    public function availability()
    {
        return new Attribute(
            get: fn () => $this->calculateAvailability()
        );  
    }
}</code>
Nach dem Login kopieren

Laravel Versions < 8:

Option 1: Appends-Eigenschaft

Für Versionen unter 8 können Sie die Eigenschaft $appends verwenden, um zu steuern, welche Attribute in der Serialisierung enthalten sind Form des Modells:

<code class="php">class EventSession extends Eloquent {

    protected $table = 'sessions';
    protected $appends = array('availability');

    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();  
    }
}<p><strong>Option 2: toArray()-Methode überschreiben</strong></p>
<p>Alternativ können Sie die toArray()-Methode überschreiben und das Attribut manuell festlegen: </p>
<pre class="brush:php;toolbar:false"><code class="php">class Book extends Eloquent {

    protected $table = 'books';
    
    public function toArray()
    {
        $array = parent::toArray();
        $array['upper'] = $this->upper;
        return $array;
    }
    
    public function getUpperAttribute()
    {
        return strtoupper($this->title);    
    }

}</code>
Nach dem Login kopieren

Option 3: Schleife durch mutierte Attribute

Wenn Sie über zahlreiche benutzerdefinierte Accessoren verfügen, können Sie diese durchlaufen und während der Serialisierung anwenden:

<code class="php">class Book extends Eloquent {

    protected $table = 'books';
    
    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>
Nach dem Login kopieren

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!