Ini kode saya:
$catIds = array(7,8,9);
$collection = Mage::getModel('catalog/product')->getCollection()
->addAttributeToSelect("*");
->addAttributeToFilter('category_ids', array('nin' => $catIds));
Saya ingin mendapatkan semua produk yang tidak ada dalam daftar id kategori tetapi kode saya tidak memberikan hasil yang diharapkan. Tolong tunjukkan saya jalan, terima kasih.
magento-1
filter
product-collection
category-products
Lan Nguyen
sumber
sumber
Jawaban:
Anda harus bergabung dengan tabel yang memuat kategori / hubungan produk.
Variasi koleksi yang saya gunakan untuk menemukan semua produk DI daftar kategori harus melakukan trik untuk Anda:
(belum diuji, tetapi seharusnya membuat Anda di jalur yang benar)
ref: http://www.proxiblue.com.au/blog/Collection_of_products_in_all_child_categories/
sumber
Kode berikut akan bekerja untuk Anda:
sumber
Saya telah menemukan cara yang agak lebih baik untuk melakukan ini, menggunakan anti-gabung (Magento 1.9).
Manfaat dari pendekatan ini
Manfaat dari ini daripada jawaban awal adalah bahwa Anda tidak akan mendapatkan hasil positif yang salah, dan hasilnya lebih cepat dan lebih sedikit kemungkinan kesalahan. Misalnya, anggap Anda memiliki satu produk:
Anda ingin "menemukan semua produk yang tidak ada
category 3
, lalu menambahkannya kecategory 3
" . Jadi Anda menjalankanNOT IN
kueri, dan itu akan mengembalikan dua baris(name | category_id)
:Bukan masalah besar, Magento masih akan hanya mengembalikan hasil pertama, dan kemudian Anda menambahkannya. Kecuali ! Saat kedua kueri ini dijalankan, Anda memiliki hasil yang sama:
Dan Magento akan memberi tahu Anda bahwa Anda belum menambahkan kemeja ini
category 3
. Ini karena ketika suatu produk termasuk dalam beberapa kategori, mereka akan memiliki banyak baris dalam tabel "catalog_product_entity" . SehinggaLEFT JOIN
akan mengembalikan beberapa hasil.Ini tidak diinginkan karena
in_array($categoryThree, $product->getCategories())
), artinya Anda akan mengulang hasil yang tidak perlu. Ini akan membuat skrip / kode Anda lebih lambat, terutama dengan inventaris besar.Larutan
Kueri SQL yang dihasilkan akan terlihat seperti:
Penjelasan:
Diberikan produk dan tabel hubungan kategori produk <=>:
catalog_product_entity
+-----------+ | ENTITY_ID | +-----------+ | 423 | | 424 | | 425 | +-----------+
catalog_category_product
+-------------+------------+ | CATEGORY_ID | PRODUCT_ID | +-------------+------------+ | 3 | 423 | | 123 | 424 | | 3 | 425 | +-------------+------------+
Kueri Anda mengatakan, "beri saya semua baris dalam " catalog_product_entity " , dan rekatkan pada kolom" category_id "dari " catalog_category_product " . Lalu beri saya baris yang category_id = 124" .
Karena ini adalah join kiri, ia akan selalu memiliki baris dari "catalog_product_entity" . Untuk setiap baris yang tidak dapat dicocokkan, itu akan menjadi
NULL
:Hasil
+-------------+-------------+ | ENTITY_ID | CATEGORY_ID | +-------------+-------------+ | 423 | NULL | | 424 | 123 | | 425 | NULL | +-------------+-------------+
Dari sana, kueri kemudian berkata, "ok, sekarang berikan saya semua tempat di mana category_id adalah NULL" .
sumber
Tidak semudah kelihatannya.
Berikut adalah opsi berbasis-GROUP_CONCAT karena batas defaultnya (1024 tapi tentu saja dapat ditingkatkan) harusnya oke dengan ID kategori produk dipisahkan dengan koma yang ditetapkan.
Juga (jika Anda tidak suka GROUP_CONCAT), Anda dapat menggunakan WHERE product_id TIDAK DI subquery dari ID produk yang sebenarnya dalam kategori yang perlu Anda kecualikan (tidak berikan di sini).
Pendekatan anti-gabung dari jawaban lain juga akan berhasil. Tetapi dalam hal ini Anda tidak dapat dengan mudah menambahkan kondisi tambahan.
sumber