Saya punya model khusus dan model sumber daya. Saya ingin memuat satu contoh model menggunakan lebih dari 1 bidang.
Model memiliki bidang-bidang berikut:
id
tag_name
custom_name
group_name
Saya ingin memuat model ini berdasarkan tag_name, custom_name, dan group_name, bukan id.
Saat ini saya menggunakan koleksi dan addFilter untuk setiap bidang. Ini berfungsi, tetapi saya bertanya-tanya apakah ada strategi standar untuk hal semacam ini di Magento?
EDIT
Core magento tampaknya tidak menggunakan koleksi untuk skenario ini, melainkan menggunakan kueri sql langsung dalam model sumber daya.
contoh dari ini adalah:
loadByAccountAndDate()
di Mage_Paypal_Model_Resource_Report_Settlement
Apakah ada alasan untuk ini, ketika koleksi tampaknya menjadi cara yang lebih ringkas, dalam hal jumlah kode yang akan ditulis
Aku hanya tidak tahu mengapa Magento memilih untuk melakukannya dengan cara ini
sumber
_itemObjectClass
yang sama dengan model yang benar-benar memanggilloadByMultiple
. Jadi sebagai hasilnya, tidak akan$x = Mage::getModel('some/model')
menjadi satu contoh model dan$x->loadByMultiple($tag, $customName, $group)
benar-benar menjadi contoh yang berbeda / baru?loadByAttribute
. Lihat pertanyaan ini untuk referensi: magento.stackexchange.com/q/5926/146Module / Model / SomeModel.php
Modul / Model / Sumber Daya / SomeModel.php:
Dan akhirnya Anda dapat memuat model berikut:
Diperbarui
Omong-omong, Anda dapat menggunakan metode (loadByAttributes) ini dengan mudah daripada koleksi dan lebih mudah dimengerti. Magento juga mengirimkan beberapa acara saat memuat koleksi atau entitas dan ekstensi pihak ketiga dapat memperbarui koleksi atau entitas oleh pengamat. Jika Anda memuat entitas melalui sumber daya (diberikan sebagai contoh milik saya dan milik Anda) tidak ada kejadian / pengamat menyala dan Anda bisa mendapatkan entitas "bersih" lebih cepat daripada pengumpulan. Juga Magento tidak menggunakan koleksi cache dengan cara ini, ia memuatnya langsung dari tabel db.
Mungkin itulah alasan menggunakan metode ini oleh modul inti Magento.
sumber
$this->setData($this->getResource()->loadByAttributes($attributes));
yang seharusnya:$this->setData($this->getResource()->loadByAttributes($attributes)->getData());
Benar?Anda melakukannya dengan benar
addFilter
. Di Magento Anda dapat memuat dengan atribut apa pun tetapi tidak sekaligus dengan banyak atribut. Dengan menambahkan filter, Anda mencapai efek yang sama tanpa overhead tambahan.sumber
addFilter
sedang dilakukan? :-)Pertama - strategi Anda untuk memfilter koleksi sudah benar. Karena koleksi di Magento lazy-load, Anda memiliki kemampuan untuk membuat metode dalam model sumber daya Anda untuk lebih ketat menentukan persyaratan pemuatan khusus Anda.
Tanpa beberapa kode Anda untuk dijadikan sampel, pertimbangkan metode semu berikut dalam Model Sumber Daya Anda:
sumber