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.

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

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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.