Magento 2オブジェクトリポジトリのフィルタリング


24

Magento 2では、製品リポジトリを使用して製品属性でフィルタリングできますか?

Magento 2では、検索条件オブジェクトを使用できます

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

およびリポジトリ

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

オブジェクトのリストを取得するには

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

ただし、searchCriteriaオブジェクトには、直接フィルタリング機能はありません(と思われますか?)。検索条件クラスに、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);
}    

しかし、PHPの型指定されていない配列のおかげで、正確にフィルターグループが何であるかは明確ではありません。

Magento 2リポジトリを使用して次のようなことを行うにはどうすればよいですか

  • [この特定のSKU]を持つすべての製品を表示する
  • [この日付]以降に作成されたすべての製品を表示する

2
上記のグループはMagento \ Framework \ Api \ Search \ FilterGroupの配列で、\ Magento \ Framework \ Api \ Filterフィルターがあり、フィルターは\ Magento \ Framework \ Api \ FilterBuilderで構築でき、condition_typeは「eq」、「neq」、「gt」などの形式。ただし、サポートされている条件タイプのリストが見つかりませんでした:\
Petar Dzhambazov

2
実際、リストのようなものは、Magento / Framework / Api / CriteriaInterface.php:79
Petar Dzhambazov

回答:


30

次のサンプルクラスをご覧ください。SKUでフィルタリングするには、これを試してください:

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

特定の日付以降に作成された製品を取得するには、これ:

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

サンプルクラス:

<?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
おかげで、ちょうど私が何をしたか!複数のフィルターを追加すると「OR」条件が作成されるように見えますが、「AND」条件を作成する方法はありますか?
アランストーム

3
—時間があれば。フィルターグループを正しく使用していますか?彼らは、OR、NOT ANDとして適用されているように見えるmagento.stackexchange.com/questions/91023/...
アラン・ストーム

4
フィルターは1つのフィルターグループ内で「OR」と結合され、各グループは検索条件のレベルで「AND」と結合されます。見てください:\ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFilterGroups($ groups [])および\ Magento \ Framework \ Api \ Search \ FilterGroupBuilder :: setFilters($ filters [])
Alex Paliarush

Magento 2.3を使用していますが、アイテムが「out_of_stock」の場合、検索条件ビルダーはアイテムをフィルタリングしませんか?
タコ

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
あなたの例で\Magento\Framework\Api\Search\SearchCriteriaBuilderは使用されているように見えます(検索固有のもの)、私は使用しましたが\Magento\Framework\Api\SearchCriteriaBuilder(すべてのサービスに一般的)、私の答えを参照してください。また、フィルターを追加するより簡単な方法を提供し、addFilter()署名が異なります。
アレックスPaliarush

同意した、それはわずかに異なるソリューションです。
LDusan

addfilterは1つのパラメータのみを使用できますか?
アントニオペディチーニ

@ LDusan、objectmanagerで「$ searchCriteriaBuilder」を使用する方法を教えてください。
Sarfaraj Sipai

2
クラスのコンストラクタに追加する必要があると思いますが、なぜオブジェクトマネージャを使用したいのですか?
-LDusan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.