过滤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

Answers:


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,而不是AND magento.stackexchange.com/questions/91023/...
艾伦风暴

4
过滤器在一个过滤器组中与“或”组合,并且每个组在搜索条件级别上与“与”组合。看看:\ 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()签名是不同的。
Alex Paliarush

同意,这是一个稍微不同的解决方案。
LDusan 2015年

addfilter只能使用1个参数吗?
Antonio Pedicini

@LDusan,您能告诉我如何在objectmanager中使用“ $ searchCriteriaBuilder”吗?
Sarfaraj Sipai

2
我认为您应该将其添加到类的构造函数中,为什么要为此使用对象管理器?
LDusan '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.