Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menambah Atribut Tersuai pada Model Fasih Laravel pada Muatan?

Bagaimana untuk Menambah Atribut Tersuai pada Model Fasih Laravel pada Muatan?

Patricia Arquette
Patricia Arquetteasal
2024-11-01 07:41:30754semak imbas

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

Bagaimanakah untuk Menambahkan Atribut Tersuai pada Model Laravel Eloquent pada Muatan?

Dalam Laravel Eloquent, anda mungkin menghadapi senario yang ingin anda tambahkan atribut tersuai kepada model apabila ia dimuatkan. Sebagai contoh, pertimbangkan pengawal seperti ini:

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

Adalah senang untuk melangkau gelung manual dan atribut 'tersedia' diisi secara automatik.

Masalahnya

Isu di sini ialah kaedah toArray() model mengabaikan pengakses yang tidak sepadan dengan lajur dalam jadual asas. Ini adalah reka bentuk yang disengajakan atas sebab prestasi.

Penyelesaian

Versi Laravel >= 8:

Mujurlah, terdapat cara yang elegan untuk mencapai ini menggunakan kelas Atribut:

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

    protected $table = 'sessions';

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

Versi Laravel < 8:

Pilihan 1: Menambah Harta

Untuk versi kurang daripada 8, anda boleh menggunakan sifat $appends untuk mengawal atribut yang disertakan dalam siri bentuk model:

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

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

    public function getAvailabilityAttribute()
    {
        return $this->calculateAvailability();  
    }
}<p><strong>Pilihan 2: Kaedah Override toArray()</strong></p>
<p>Sebagai alternatif, anda boleh mengatasi kaedah toArray() dan tetapkan atribut secara manual: </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>

Pilihan 3: Gelung Melalui Atribut Bermutasi

Jika anda mempunyai banyak pengakses tersuai, anda boleh mengulanginya dan menerapkannya semasa penyirian:

<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>

Atas ialah kandungan terperinci Bagaimana untuk Menambah Atribut Tersuai pada Model Fasih Laravel pada Muatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn