마 젠토 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"조건을 생성하는 방법이 있습니까?
Alan Storm

3
— 순간이 있다면. 필터 그룹을 올바르게 사용하고 있습니까? 그들은 AND magento.stackexchange.com/questions/91023/가
Alan Storm

4
필터는 하나의 필터 그룹 내에서 "OR"과 결합되고 각 그룹은 검색 기준 레벨에서 "AND"와 결합됩니다. 에서보세요 : \ 젠토 \ 프레임 워크 \ API 광고 \ SearchCriteriaBuilder :: setFilterGroups ($ 그룹 [])와 \ 젠토 \ 프레임 워크 \ API 광고 \ 검색 \ FilterGroupBuilder :: setFilters ($ 필터 [])
알렉스 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 2016

동의, 약간 다른 솔루션입니다.
LDusan

addfilter는 1 개의 매개 변수 만 사용할 수 있습니까?
안토니오 Pedicini

@LDusan, objectmanager에서 "$ searchCriteriaBuilder"를 어떻게 사용할 수 있는지 알려주시겠습니까?
Sarfaraj Sipai

2
클래스 생성자에 추가해야한다고 생각합니다. 왜 객체 관리자를 사용하고 싶습니까?
LDusan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.