Magento 2: Filter Koleksi Produk berdasarkan Beberapa Kategori (Magento 2.1)

10

Saya menggunakan Magento 2.1.0 dan saat ini saya mengalami kesulitan dalam menyaring koleksi produk dengan beberapa kategori. Saya telah menggunakan lebih dari beberapa cara untuk membuatnya bekerja tetapi tidak.

Asumsi:

$catalog_ids = [618, 619, 620];
  1. Mengembalikan NULL

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
  2. Pengembalian pengecualian: Nama atribut tidak valid: category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
  3. Mengembalikan kesalahan Sintaks atau pelanggaran akses

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_ids', array(
            'finset' => $catalog_ids
        ));

Adakah saran tentang bagaimana saya dapat memiliki pekerjaan ini atau memiliki sesuatu yang menghubungkan pekerjaan ini?

Morgy
sumber
Coba periksa sql yang dihasilkan. $ productCollection-> getSelectSql (true);
Arkadii Chyzhov

Jawaban:

13

Anda mungkin terbiasa dengan $thisparadigma "setiap metode pengembalian " dari Magento 1. Ini bukan kasus lagi (setidaknya tidak selalu).

Secara khusus, addCategoriesFilter()tidak mengembalikan apa pun dan itulah sebabnya Anda dapatkan null.

Ubah kode menjadi:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));
Fabian Schmengler
sumber
3
Menyarankan bahwa ini bukan masalahnya lagi mungkin dinyatakan terlalu kuat. Fungsi 'addCategoryFilter' (tunggal) di kelas yang sama mengembalikan $ this; jadi menambahkan nilai kembali di 'addCategoriesFilter' mungkin baru saja luput dari perhatian pengembang.
Patrick van Bergen
ya, itu juga masuk akal
Fabian Schmengler
2

Percobaan pertama Anda jelas merupakan cara yang tepat untuk melakukannya:

$values = [318, 619, 620];
$conditionType = "in";
$productCollection->addCategoriesFilter([$conditionType => $values]);

Sekarang ada dua hal yang harus dipastikan: $productCollectionharus menjadi contoh Magento\Catalog\Model\ResourceModel\Product\Collectionagar ini berfungsi (atau dari kelas yang memperpanjangnya).

Dan jelas Anda perlu memiliki produk dalam catalog_category_producttabel yang cocok dengan kondisi itu, mungkin itu tidak terjadi dan itu sebabnya Anda mendapatkan NULL.

Raphael di Digital Pianism
sumber
Mana cara yang lebih baik menggunakan pengumpulan produk atau menggunakan kontrak layanan? Magento \ Catalog \ Api \ Data \ ProductSearchResultsInterface
MagePsycho
@MagePsycho jika Anda memiliki pilihan selalu pergi untuk kontrak layanan;)
Raphael di Digital Pianism