Lọc kho lưu trữ đối tượng Magento 2


24

Trong Magento 2, bạn có thể sử dụng kho lưu trữ sản phẩm để lọc theo thuộc tính sản phẩm không?

Trong Magento 2, bạn có thể sử dụng một đối tượng tiêu chí tìm kiếm

\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria,

và một kho lưu trữ

\Magento\Catalog\Api\ProductRepositoryInterface $productRepository,

Để tìm nạp danh sách các đối tượng

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

Tuy nhiên, đối tượng searchCriteria không (dường như?) Có khả năng lọc trực tiếp. Lớp tiêu chí tìm kiếm không có các phương thức để thêm một cái gì đó gọi là bộ lọc Nhóm

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

Nhưng không rõ chính xác, một nhóm bộ lọc là gì nhờ các mảng chưa được xử lý của PHP.

Làm cách nào tôi có thể sử dụng kho Magento 2 để làm những việc như

  • Cho tôi xem tất cả các sản phẩm có [SKU cụ thể này]
  • Cho tôi xem tất cả các sản phẩm được tạo sau [ngày này]
  • v.v.

2
Có vẻ như các nhóm nói là một mảng của Magento \ Framework \ Api \ Search \ Filtergroup, lần lượt có \ Magento \ Framework \ Api \ Bộ lọc, các bộ lọc có thể được xây dựng với \ Magento \ Framework \ Api \ FilterBuilder và condition_type hình thức 'eq', 'neq', 'gt', v.v. Nhưng không thể tìm thấy danh sách các loại điều kiện được hỗ trợ: \
Petar Dzhambazov

2
Trên thực tế, một cái gì đó giống như một danh sách có thể được tìm thấy tại Magento / Framework / Api / CriteriaInterface.php: 79
Petar Dzhambazov

Câu trả lời:


30

Kiểm tra các lớp mẫu sau. Để lọc theo SKU, hãy thử điều này:

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

Để có được sản phẩm được tạo sau ngày cụ thể, điều này:

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

Lớp mẫu:

<?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
Cảm ơn, chỉ là những gì tôi đã sau! Có vẻ như việc thêm nhiều bộ lọc tạo điều kiện "HOẶC" - có cách nào để tạo điều kiện "VÀ" không?
Alan Storm

3
- nếu bạn có một khoảnh khắc. Tôi có đang sử dụng nhóm bộ lọc chính xác không? Họ dường như đang áp dụng dưới dạng OR, không phải là AND magento.stackexchange.com/questions/91023/iêu
Alan Storm

4
Các bộ lọc được kết hợp với "HOẶC" trong một nhóm bộ lọc và mỗi nhóm được kết hợp với "VÀ" theo mức độ tiêu chí tìm kiếm. Hãy xem: \ Magento \ Framework \ Api \ SearchCriteriaBuilder :: setFiltergroup ($ Groups []) và \ Magento \ Framework \ Api \ Search \ FiltergroupBuilder :: setFilters ($ filter [])
Alex Paliarush

Tôi đang sử dụng Magento 2.3, Trình tạo tiêu chí tìm kiếm không lọc mục nếu mục đó là "out_of_stock"?
Bạch tuộc

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
Có vẻ như trong ví dụ của bạn \Magento\Framework\Api\Search\SearchCriteriaBuilderđược sử dụng (cụ thể theo tìm kiếm), trong khi tôi đã sử dụng \Magento\Framework\Api\SearchCriteriaBuilder(chung cho tất cả các dịch vụ), hãy xem câu trả lời của tôi. Ngoài ra, nó cung cấp cách đơn giản hơn để thêm bộ lọc,addFilter() chữ ký là khác nhau.
Alex Paliarush

Đồng ý, đó là một giải pháp hơi khác nhau.
LDusan

addfilter chỉ có thể sử dụng 1 param?
Antonio Peesini

@LDusan, bạn có thể vui lòng cho tôi biết làm thế nào tôi có thể sử dụng "$ searchCriteriaBuilder" trong objectmanager không?
Sarfaraj Sipai

2
Tôi nghĩ rằng bạn nên thêm nó trong hàm tạo của lớp, tại sao bạn muốn sử dụng trình quản lý đối tượng cho điều đó?
LDusan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.