Filtraggio di un repository di oggetti Magento 2


24

In Magento 2, puoi utilizzare un repository di prodotti per filtrare in base agli attributi del prodotto?

In Magento 2, puoi usare un oggetto criteri di ricerca

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

e un repository

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Per recuperare un elenco di oggetti

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

Tuttavia, l'oggetto searchCriteria non ha (sembra?) Avere funzionalità di filtro diretto. La classe di criteri di ricerca non hanno metodi per aggiungere qualcosa chiamato 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);
}    

Ma non è chiaro cosa sia esattamente un gruppo di filtri grazie agli array non tipizzati di PHP.

Come posso usare un repository Magento 2 per fare cose del genere

  • Mostrami tutti i prodotti con [questo SKU specifico]
  • Mostrami tutti i prodotti creati dopo [questa data]
  • eccetera.

2
Sembra che detti gruppi siano un array di Magento \ Framework \ Api \ Search \ FilterGroup, che a sua volta ha i filtri \ Magento \ Framework \ Api \ Filter, i filtri possono essere creati con \ Magento \ Framework \ Api \ FilterBuilder e condition_type è in la forma di 'eq', 'neq', 'gt' ecc. Ma non è stato possibile trovare un elenco dei tipi di condizioni supportati: \
Petar Dzhambazov,

2
In realtà, qualcosa come una lista può essere trovata su Magento / Framework / Api / CriteriaInterface.php: 79
Petar Dzhambazov,

Risposte:


30

Dai un'occhiata alla seguente classe di esempio. Per filtrare per SKU, prova questo:

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

Per ottenere prodotti creati dopo una data specifica, questo:

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

Classe di esempio:

<?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
Grazie, proprio quello che stavo cercando! Sembra che l'aggiunta di più filtri crei condizioni "OR" - esiste un modo per creare condizioni "AND"?
Alan Storm,

3
- se hai un momento. Sto usando correttamente il gruppo di filtri? Sembrano applicare come OR, non come AND magento.stackexchange.com/questions/91023/…
Alan Storm,

4
I filtri sono combinati con "OR" all'interno di un gruppo di filtri e ogni gruppo è combinato con "AND" a livello di criteri di ricerca. Dai un'occhiata a: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups ($ groups []) e \ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters ($ filters [])
Alex Paliarush,

Sto usando Magento 2.3, il costruttore dei criteri di ricerca non filtra l'articolo se un articolo è "out_of_stock"?
Polpo,

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
Sembra che nel tuo esempio \Magento\Framework\Api\Search\SearchCriteriaBuildersia usato (uno specifico per la ricerca), mentre io ho usato \Magento\Framework\Api\SearchCriteriaBuilder(generico per tutti i servizi), vedi la mia risposta. Inoltre fornisce un modo più semplice di aggiungere filtri, le addFilter()firme sono diverse.
Alex Paliarush,

D'accordo, è una soluzione leggermente diversa.
LDusan,

addfilter può usare solo 1 parametro?
Antonio Pedicini,

@LDusan, puoi dirmi come posso usare "$ searchCriteriaBuilder" in objectmanager?
Sarfaraj Sipai,

2
Penso che dovresti aggiungerlo nel costruttore della tua classe, perché dovresti usare il gestore degli oggetti per quello?
LDusan,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.