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!