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-01 07:41:30760Durchsuche

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>

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>

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>

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>

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