Memfilter Repositori Objek Magento 2

24

Di Magento 2, dapatkah Anda menggunakan repositori produk untuk memfilter menurut atribut produk?

Di Magento 2, Anda dapat menggunakan objek kriteria pencarian

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

dan repositori

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Untuk mengambil daftar objek

$searchCriteria->getPageSize(10);
$list = $productRepository->getList($searchCriteria);

Namun, objek searchCriteria tidak (tampaknya?) Memiliki kemampuan penyaringan langsung. Kelas kriteria pencarian memang memiliki metode untuk menambahkan sesuatu yang disebut filterGroups

#File: lib/internal/Magento/Framework/Api/SearchCriteria.php        

public function getFilterGroups()
{
    $filterGroups = $this->_get(self::FILTER_GROUPS);
    return is_array($filterGroups) ? $filterGroups : [];
}

public function setFilterGroups(array $filterGroups = null)
{
    return $this->setData(self::FILTER_GROUPS, $filterGroups);
}    

Tapi tidak jelas apa, tepatnya, grup filter berkat array PHP yang tidak diketik.

Bagaimana saya bisa menggunakan repositori Magento 2 untuk melakukan hal-hal seperti

  • Tunjukkan semua produk dengan [SKU spesifik ini]
  • Tunjukkan semua produk yang dibuat setelah [tanggal ini]
  • dll.
Alan Storm
sumber
2
Tampaknya grup tersebut adalah array dari Magento \ Framework \ Api \ Search \ FilterGroup, yang pada gilirannya memiliki filter \ Magento \ Framework \ Api \ Filter, filter dapat dibangun dengan \ Magento \ Framework \ Api \ FilterBuilder dan condition_type ada di bentuk 'eq', 'neq', 'gt' dll. Tetapi tidak dapat menemukan daftar jenis kondisi yang didukung: \
Petar Dzhambazov
2
Sebenarnya, sesuatu seperti daftar dapat ditemukan di Magento / Framework / Api / KriteriaInterface.php: 79
Petar Dzhambazov

Jawaban:

30

Lihat kelas sampel berikut. Untuk memfilter menurut SKU, coba ini:

$productFilterDemo->getProducts('sku', 'product_sku_value', 'eq');

Untuk mendapatkan produk yang dibuat setelah tanggal tertentu, ini:

$productFilterDemo->getProducts('created_at', 'creation date', 'gt');

Kelas sampel:

<?php
namespace Vendor\ModlueName\Model;

use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Catalog\Api\ProductRepositoryInterface;

class ProductFilterDemo
{
    /** @var ProductRepositoryInterface */
    protected $productRepository;

    /** @var SearchCriteriaBuilder */
    protected $searchCriteriaBuilder;

    /**
     * Initialize dependencies.
     *
     * @param ProductRepositoryInterface $productRepository
     * @param SearchCriteriaBuilder $searchCriteriaBuilder
     */
    public function __construct(
        ProductRepositoryInterface $productRepository,
        SearchCriteriaBuilder $searchCriteriaBuilder
    ) {
        $this->productRepository = $productRepository;
        $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    }

    /**
     * Get products with filter.
     * 
     * @param string $fieldName
     * @param string $fieldValue
     * @param string $filterType
     * @return \Magento\Catalog\Api\Data\ProductInterface[]
     */
    public function getProducts($fieldName, $fieldValue, $filterType)
    {
        $searchCriteria = $this->searchCriteriaBuilder->addFilter($fieldName, $fieldValue, $filterType)->create();
        $products = $this->productRepository->getList($searchCriteria);
        return $products->getItems();
    }
}
Alex Paliarush
sumber
4
Terima kasih, hanya apa yang saya kejar! Sepertinya menambahkan beberapa filter membuat kondisi "ATAU" - apakah ada cara untuk membuat kondisi "DAN"?
Alan Storm
3
- jika Anda punya waktu. Apakah saya menggunakan grup filter dengan benar? Mereka tampaknya berlaku sebagai OR, bukan AND magento.stackexchange.com/questions/91023/…
Alan Storm
4
Filter digabungkan dengan "ATAU" di dalam satu grup filter, dan setiap grup digabungkan dengan "DAN" pada level kriteria pencarian. Lihatlah: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ groups []) dan \ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters ($ filter [])
Alex Paliarush
Saya menggunakan Magento 2.3, pembuat kriteria pencarian tidak memfilter item jika item "out_of_stock"?
Octopus
14
public function __construct(
    ProductRepositoryInterface $productRepository,
    SearchCriteriaBuilder $searchCriteriaBuilder,
    FilterBuilder $filterBuilder,
) {
    $this->productRepository = $productRepository;
    $this->searchCriteriaBuilder = $searchCriteriaBuilder;
    $this->filterBuilder = $filterBuilder;
}

public function getProducts()
{
    $filters[] = $this->filterBuilder
        ->setField('sku')
        ->setConditionType('eq')
        ->setValue('something')
        ->create();
    $this->searchCriteriaBuilder->addFilters($filters);

    $searchCriteria = $this->searchCriteriaBuilder->create();
    $searchResults = $this->productRepository->getList($searchCriteria);
    return $searchResults->getItems();
}
LDusan
sumber
1
Sepertinya dalam contoh Anda \Magento\Framework\Api\Search\SearchCriteriaBuilderdigunakan (khusus pencarian), sementara saya menggunakan \Magento\Framework\Api\SearchCriteriaBuilder(generik untuk semua layanan), lihat jawaban saya. Juga menyediakan cara sederhana untuk menambahkan filter, addFilter()tanda tangan berbeda.
Alex Paliarush
Setuju, ini solusi yang sedikit berbeda.
LDusan
dapatkah addfilter hanya menggunakan 1 param?
Antonio Pedicini
@LDusan, Bisakah Anda memberi tahu saya bagaimana saya bisa menggunakan "$ searchCriteriaBuilder," di objectmanager?
Sarfaraj Sipai
2
Saya pikir Anda harus menambahkannya di konstruktor kelas Anda, mengapa Anda ingin menggunakan manajer objek untuk itu?
LDusan