Filtern eines Magento 2-Objekt-Repositorys

24

Können Sie in Magento 2 ein Produkt-Repository verwenden, um nach Produktattributen zu filtern?

In Magento 2 können Sie ein Suchkriterienobjekt verwenden

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

und ein Repository

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Zum Abrufen einer Liste von Objekten

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

Das searchCriteria-Objekt verfügt jedoch offenbar nicht über direkte Filterfunktionen. Die Suchkriterienklasse verfügt über Methoden zum Hinzufügen von so genannten Filtergruppen

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

Aber es ist nicht klar, was genau eine Filtergruppe ist, dank der untypisierten Arrays von PHP.

Wie kann ich ein Magento 2-Repository verwenden, um Dinge wie zu tun

  • Zeige mir alle Produkte mit [dieser spezifischen SKU]
  • Zeige mir alle Produkte, die nach [diesem Datum] erstellt wurden
  • etc.
Alan Storm
quelle
2
Anscheinend handelt es sich bei besagten Gruppen um ein Array von Magento \ Framework \ Api \ Search \ FilterGroup, das wiederum über \ Magento \ Framework \ Api \ Filter-Filter verfügt. Filter können mit \ Magento \ Framework \ Api \ FilterBuilder erstellt werden und condition_type befindet sich in Die Form von 'eq', 'neq', 'gt' usw. Es wurde jedoch keine Liste der unterstützten Bedingungstypen gefunden: \
Petar Dzhambazov,
2
So etwas wie eine Liste finden Sie unter Magento / Framework / Api / CriteriaInterface.php: 79
Petar Dzhambazov

Antworten:

30

Schauen Sie sich die folgende Beispielklasse an. Versuchen Sie Folgendes, um nach Artikelnummer zu filtern:

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

So erhalten Sie Produkte, die nach einem bestimmten Datum erstellt wurden:

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

Beispielklasse:

<?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
quelle
4
Danke, genau das, wonach ich gesucht habe! Es sieht so aus, als würden durch das Hinzufügen mehrerer Filter "ODER" -Bedingungen erstellt. Gibt es eine Möglichkeit, "UND" -Bedingungen zu erstellen?
Alan Storm
3
- Wenn Sie einen Moment Zeit haben. Verwende ich die Filtergruppe richtig? Sie scheinen als ODER zu Anwendung, nicht ein UND magento.stackexchange.com/questions/91023/...
Alan Sturm
4
Filter werden mit "ODER" innerhalb einer Filtergruppe kombiniert, und jede Gruppe wird auf der Ebene der Suchkriterien mit "UND" kombiniert. Werfen Sie einen Blick auf: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ groups []) und \ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters ($ filters [])
Alex Paliarush 21.11.15
Ich verwende Magento 2.3. Der Builder für Suchkriterien filtert den Artikel nicht, wenn ein Artikel "out_of_stock" ist.
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
quelle
1
Sieht so aus, als würde in Ihrem Beispiel \Magento\Framework\Api\Search\SearchCriteriaBuilder(suchspezifisch) verwendet, während ich \Magento\Framework\Api\SearchCriteriaBuilder(generisch für alle Dienste) verwendet habe, siehe meine Antwort. Es bietet auch eine einfachere Möglichkeit zum Hinzufügen von Filtern, da sich die addFilter()Signaturen unterscheiden.
Alex Paliarush
Einverstanden, es ist eine etwas andere Lösung.
LDusan
Kann addfilter nur 1 Parameter verwenden?
Antonio Pedicini
@LDusan, können Sie mir bitte sagen, wie ich "$ searchCriteriaBuilder" im Objektmanager verwenden kann?
Sarfaraj Sipai
2
Ich denke, dass Sie es im Konstruktor Ihrer Klasse hinzufügen sollten, warum sollten Sie den Objekt-Manager dafür verwenden?
LDusan