Filtrowanie repozytorium obiektów Magento 2


24

Czy w Magento 2 można użyć repozytorium produktów do filtrowania według atrybutów produktu?

W Magento 2 możesz użyć obiektu kryteriów wyszukiwania

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

i repozytorium

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Aby pobrać listę obiektów

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

Jednak obiekt searchCriteria nie ma (wydaje się?) Możliwości bezpośredniego filtrowania. Klasa Kryteria wyszukiwania nie ma metody dodając coś o nazwie 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);
}    

Ale nie jest jasne, czym dokładnie jest grupa filtrów dzięki nietypowym tablicom PHP.

Jak mogę używać repozytorium Magento 2 do robienia takich rzeczy

  • Pokaż wszystkie produkty z [tym konkretnym SKU]
  • Pokaż mi wszystkie produkty utworzone po [tej dacie]
  • itp.

2
Wygląda na to, że wspomniane grupy to tablica Magento \ Framework \ Api \ Search \ FilterGroup, która z kolei ma filtry \ Magento \ Framework \ Api \ Filter, filtry można budować za pomocą \ Magento \ Framework \ Api \ FilterBuilder, a typ warunku jest w forma „eq”, „neq”, „gt” itd. Ale nie można znaleźć listy obsługiwanych typów warunków: \
Petar Dzhambazov

2
Właściwie coś w rodzaju listy można znaleźć na Magento / Framework / Api / CriteriaInterface.php: 79
Petar Dzhambazov

Odpowiedzi:


30

Sprawdź następującą przykładową klasę. Aby filtrować według kodu SKU, spróbuj tego:

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

Aby uzyskać produkty utworzone po określonej dacie, należy:

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

Przykładowa klasa:

<?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
Dzięki, właśnie tego szukałem! Wygląda na to, że dodanie wielu filtrów tworzy warunki „LUB” - czy istnieje sposób na utworzenie warunków „ORAZ”?
Alan Storm,

3
- jeśli masz chwilę. Czy prawidłowo używam grupy filtrów? Wydaje się, że aplikują jako OR, a nie ORAZ magento.stackexchange.com/questions/91023/...
Alan Storm

4
Filtry są łączone z „LUB” w jednej grupie filtrów, a każda grupa jest łączona z „I” na poziomie kryteriów wyszukiwania. Spójrz na: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ groups []) i \ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters ($ filtry [])
Alex Paliarush

Używam Magento 2.3, Konstruktor kryteriów wyszukiwania nie filtruje elementu, jeśli element jest „out_of_stock”?
Ośmiornica

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
Wygląda na to, że w twoim przykładzie \Magento\Framework\Api\Search\SearchCriteriaBuilderużyto (konkretnego wyszukiwania), podczas gdy ja użyłem \Magento\Framework\Api\SearchCriteriaBuilder(ogólny dla wszystkich usług), zobacz moją odpowiedź. Zapewnia również prostszy sposób dodawania filtra, addFilter()podpisy są różne.
Alex Paliarush,

Zgadzam się, to nieco inne rozwiązanie.
LDusan,

czy addfilter może używać tylko 1 parametru?
Antonio Pedicini

@LDusan, Czy możesz mi powiedzieć, jak mogę używać „$ searchCriteriaBuilder” w menedżerze obiektów?
Sarfaraj Sipai

2
Myślę, że powinieneś dodać go do konstruktora swojej klasy, dlaczego miałbyś do tego używać menedżera obiektów?
LDusan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.