Saya ingin dapat menambahkan atribut / properti khusus ke model Laravel / Eloquent ketika dimuat, mirip dengan bagaimana hal itu dapat dicapai dengan metode RedBean $model->open()
.
Sebagai contoh, saat ini, di controller saya, saya punya:
public function index()
{
$sessions = EventSession::all();
foreach ($sessions as $i => $session) {
$sessions[$i]->available = $session->getAvailability();
}
return $sessions;
}
Alangkah baiknya untuk menghilangkan loop dan memiliki atribut 'tersedia' sudah diatur dan diisi.
Saya sudah mencoba menggunakan beberapa peristiwa model yang dijelaskan dalam dokumentasi untuk melampirkan properti ini ketika objek dimuat, tetapi sejauh ini tidak berhasil.
Catatan:
- 'tersedia' bukan bidang di tabel yang mendasarinya.
$sessions
sedang dikembalikan sebagai objek JSON sebagai bagian dari API, dan oleh karena itu memanggil sesuatu seperti$session->available()
pada templat bukanlah pilihan
protected $hidden = []
untuk menambahkan kolom / pengakses yang telah dikecualikan.Hal terakhir pada halaman doc Laravel Eloquent adalah:
Itu dapat digunakan secara otomatis untuk menambahkan pengakses baru ke model tanpa pekerjaan tambahan seperti memodifikasi metode seperti
::toArray()
.Cukup buat
getFooBarAttribute(...)
accessor dan tambahkanfoo_bar
ke$appends
array.sumber
toArray
metode overriding .Jika Anda mengubah nama Anda
getAvailability()
metode untukgetAvailableAttribute()
metode Anda menjadi accessor dan Anda akan dapat membacanya menggunakan->available
langsung pada model Anda.Documents: https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
EDIT: Karena atribut Anda adalah "virtual", itu tidak termasuk secara default dalam representasi JSON objek Anda.
Tapi saya menemukan ini: Accessors model kustom tidak diproses ketika -> toJson () dipanggil?
Untuk memaksa atribut Anda dikembalikan dalam array, tambahkan itu sebagai kunci ke array $ attributes.
Saya tidak mengujinya, tetapi seharusnya cukup sepele bagi Anda untuk mencoba pengaturan Anda saat ini.
sumber
->available
disediakan pada$session
objek, tetapi karena$sessions
akan dikonversi langsung menjadi string JSON (itu bagian dari API), tidak ada kesempatan untuk menggunakan ini.EventSession::all()
mengembalikan objek JSON dari API, Anda tidak benar-benar menggunakan model Laravel, bukan? Maaf, saya bingung tentang bagaimana Anda menerapkan model Anda.class EventSession extends Eloquent
).::all()
hanya sebagai contoh.EventSession::find(170071)
akan menjadi yang lain. Ini disebut di berbagai titik di seluruh SessionController (SessionController extends \BaseController
) yang akan dipanggil melalui URL seperti '/ sesi / 170071'.public $available
ke model, ini tidak ditampilkan ketika objek dikonversi.protected $appends = array('is_admin');
)Saya memiliki sesuatu yang simular: Saya memiliki gambar atribut dalam model saya, ini berisi lokasi file di folder Storage. Gambar harus dikembalikan base64 disandikan
sumber
Anda dapat menggunakan
setAttribute
fungsi dalam Model untuk menambahkan atribut khusussumber
Katakanlah Anda memiliki 2 kolom bernama first_name dan last_name di tabel pengguna Anda dan Anda ingin mengambil nama lengkap. Anda dapat mencapai dengan kode berikut:
sekarang Anda bisa mendapatkan nama lengkap sebagai:
sumber
Langkah 1: Tentukan atribut pada
$appends
Langkah 2: Tentukan accessor untuk atribut itu.
Contoh:
sumber
Dalam model langganan saya, saya perlu tahu langganan dijeda atau tidak. di sini adalah bagaimana saya melakukannya
maka pada tampilan template, saya bisa menggunakan
$subscription->is_paused
untuk mendapatkan hasilnya.The
getIsPausedAttribute
adalah format untuk mengatur atribut khusus,dan gunakan
is_paused
untuk mendapatkan atau menggunakan atribut dalam tampilan Anda.sumber
dalam kasus saya, membuat kolom kosong dan mengatur pengaksesnya berfungsi dengan baik. accessor saya mengisi usia pengguna dari kolom dob. Fungsi toArray () berfungsi juga.
sumber