Magento 2: Cara Memfilter Koleksi Produk Berdasarkan ID Toko

11

Menggunakan objek pabrik produk, saya dapat membuat produk, mengambil koleksi produk, dan mengambil item pertama dari koleksi itu

/* var $productFactory \Magento\Catalog\Model\ProductFactory */
$product = $this->productFactory->create()->getCollection()->getFirstItem();

Namun, jika saya mencoba menambahkan store_id ke filter koleksi

    $product = $this->productFactory
        ->create()
        ->getCollection()
        ->addFieldToFilter('store_id', 1)
        ->getFirstItem();

Saya mendapatkan kesalahan berikut

Invalid attribute name: store_id
#0 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(1434): Magento\Eav\Model\Entity\Collection\AbstractCollection->_addAttributeJoin('store_id', 'inner')
#1 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(359): Magento\Eav\Model\Entity\Collection\AbstractCollection->_getAttributeConditionSql('store_id', 1, 'inner')
#2 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Catalog/Model/Resource/Product/Collection.php(1489): Magento\Eav\Model\Entity\Collection\AbstractCollection->addAttributeToFilter('store_id', 1, 'inner')
#3 /Users/alanstorm/Sites/magento-2-dev-docs.dev/magento2/app/code/Magento/Eav/Model/Entity/Collection/AbstractCollection.php(382): Magento\Catalog\Model\Resource\Product\Collection->addAttributeToFilter('store_id', 1)
...
#63 {main}

Hal yang sama terjadi jika saya mencoba menggunakan repositori produk untuk memfilter oleh store_id (repositori menggunakan koleksi di bawah tenda).

Apakah ini bug? Atau apakah hubungan antara toko, situs web, dan produk berubah di Magento 2 sedemikian rupa sehingga ini bukan lagi permintaan yang sah? Kedua? Bukan? Sesuatu yang lain

Alan Storm
sumber
Saya sangat baru di M2, tetapi tidak bisakah Anda menggunakan github.com/magento/magento2/blob/develop/app/code/Magento/… ini ?
fmrng
@ fnng Gunakan metode untuk mengetahui, tetapi saya ingin mengatakan "tolong beri saya daftar semua produk yang merupakan bagian dari toko X". Tidak yakin bagaimana setStoreId akan melakukannya.
Alan Storm

Jawaban:

4

Anda dapat melakukannya dengan metode ini addStoreFilter(), lihatMagento\Catalog\Model\ResourceModel\Product\Collection#addStoreFilter()

yang addStoreFilter()fungsi akan menerima toko ID atau Storeobjek sebagai parameter.

EG, untuk mendapatkan semua produk untuk toko saat ini :

public function getProducts(){
    return $this->collection->addStoreFilter($this->_storeManager->getStore()); 
}

Semoga ini bisa membantu.

Amit Bera
sumber
Terima kasih @amitbeta! Jika Anda punya waktu - apakah Anda tahu apakah mungkin membuat filter toko menggunakan repositori produk? magento.stackexchange.com/questions/91278/…
Alan Storm
tentu .. saya akan melihat
Amit Bera
@AmitBera, Tolong bisa Anda jelaskan sedikit cara menggunakan addStoreFilter () untuk koleksi produk.
5

Untuk saat ini ini terlihat seperti bug, karena tidak ada kemungkinan untuk menerapkan filter toko dengan ProductRepository::getList()metode ini, melewati id toko sebagai filter dari SearchCriteria .

Dalam implementasi getList, Anda dapat menemukan bahwa semua filter dari SearchCriteria diterapkan ke koleksi

    foreach ($searchCriteria->getFilterGroups() as $group) {
        $this->addFilterGroupToCollection($group, $collection);
    }

Di Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionsana ada penanganan khusus untuk filter Kategori , tetapi tidak ada satu untuk Store.

Jadi, kondisi tambahan harus ditambahkan ke Magento\Catalog\Model\ProductRepository::addFilterGroupToCollectionyang memeriksa apakah kita memiliki filter toko dan jika kita telah - mengatur id toko untuk koleksi, sesuatu seperti:

        if ($filter->getField() == \Magento\Catalog\Model\Product::STORE_ID) {
            $collection->setStore($filter->getValue());
            continue;
        }

Dibuat bug internal untuk masalah ini, jumlahnya adalah MAGETWO-45950

Igor Minyaylo
sumber
Ada berita tentang itu? Saya tidak dapat menemukan referensi ke nomor tiket di Github.
Fabian Schmengler
1
Di Magento 2 produk ditugaskan ke Situs Web, bukan ke Toko. Jadi, perilaku awal yang dijelaskan oleh Alan benar, karena entitas Produk tidak memiliki tautan Id Store, hanya tautan ke Id Situs Web. Dan tiket internal adalah tentang pengenalan atribut Extension dengan ProductWebsiteLinkInterface ke dalam ProductInterface
Igor Minyaylo
Selain asosiasi toko / situs web, tidak setStore()juga menentukan nilai atribut khusus toko mana yang diambil? Atau apakah ini dilakukan dengan cara yang berbeda sekarang?
Fabian Schmengler
Ada metode setStoreId / getStoreId dalam implementasi model Produk, tetapi tidak ada yang di ProductInterface, jadi tidak disarankan untuk mengandalkan mereka dalam logika bisnis Anda.
Igor Minyaylo
Untuk saat ini menyelesaikan nilai level StoreView (misalnya, pelokalan atribut) yang dibuat oleh bagian URL StoreID di API REST
Igor Minyaylo
0

Jika Anda menggunakan model khusus dengan beberapa tabel tambahkan table_name seperti: addFieldToFilter('**table_name.**column_name', 1)

PolyakovAO
sumber
Bisakah Anda berbagi seluruh cuplikan untuk memuat koleksi produk dari kolom saya katakan entitas id, seperti yang Anda katakan di atas
Sushivam
0

1) Kelasnya adalah \Magento\Catalog\Model\ResourceModel\Category\Collection:

/** @var \Magento\Catalog\Model\ResourceModel\Category\Collection $collection */
$collection = $this->categoryFactory->create()->getCollection()
        ->addFieldToSelect('*');

2) Kemudian metodenya $collection->setStoreId(0);

Giedrius Tumelis
sumber
PS bukannya 0 Anda dapat menempatkan id toko Anda 1, 2, ...
Giedrius Tumelis
Meta: Entah mengapa simbol bintang telah dihapus dari pesan saya di sini.
Giedrius Tumelis