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.

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();
    }
}

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();
}

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.