Tôi đang cố gắng sử dụng kho lưu trữ sản phẩm để tìm nạp danh sách các sản phẩm. Tôi muốn tìm nạp dựa trên hai bộ lọc, kết hợp với một AND
tiêu chí, nhưng mọi thứ dường như không hoạt động. Tôi không hiểu làm thế nào các nhóm bộ lọc hoạt động? Hay đây là một lỗi cần được báo cáo?
Cụ thể, (ví dụ ngớ ngẩn vì đơn giản) Tôi có một nhà xây dựng nơi tôi tiêm trình xây dựng bộ lọc, trình tạo nhóm bộ lọc và trình tạo tiêu chí tìm kiếm
public function __construct(
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
\Magento\Framework\Api\FilterBuilder $filterBuilder,
\Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder
)
{
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
$this->filterBuilder = $filterBuilder;
$this->filterGroupBuilder = $filterGroupBuilder;
}
Sau đó, sau này trong một phương thức, tôi sử dụng các trình tạo bộ lọc để xây dựng hai bộ lọc
$filter1 = $this->filterBuilder->setField('sku')
->setValue('24-MB01')
->setConditionType('eq')
->create();
$filter2 = $this->filterBuilder->setField('sku')
->setValue('WT08-XS-Black')
->setConditionType('eq')
->create();
Sau đó, tôi sử dụng trình tạo nhóm bộ lọc để xây dựng nhóm bộ lọc bao gồm hai bộ lọc này
$filter_group = $this->filterGroupBuilder
->addFilter($filter1)
->addFilter($filter2)
->create();
Sau đó, tôi đã sử dụng trình xây dựng tiêu chí tìm kiếm, đặt nhóm bộ lọc trên đó
$criteria = $this->searchCriteriaBuilder
->setFilterGroups([$filter_group])
->setPageSize(100)
->create();
return $criteria
Cuối cùng, khi tôi sử dụng tiêu chí này với kho lưu trữ sản phẩm (được sử dụng ở nơi khác, bỏ qua hàm tạo và di để tránh nhầm lẫn)
/* @var Magento\Catalog\Api\ProductRepositoryInterface */
$list = $productRepository->getList($searchCriteria);
Cuộc gọi thành công nhưng tôi nhận lại được hai sản phẩm. tức là bộ lọc SKU được áp dụng như một OR
, không phải là một AND
. Tôi hy vọng truy vấn này sẽ không trả lại gì.
Nếu tôi đào sâu vào Magento\Catalog\Api\ProductRepository
lớp, và hãy xem quy chế chọn của bộ sưu tập
protected function addFilterGroupToCollection(
\Magento\Framework\Api\Search\FilterGroup $filterGroup,
Collection $collection
) {
//...
if ($fields) {
$collection->addFieldToFilter($fields);
}
//printf lives in my heart forever
echo($collection->getSelect()->__toString());
exit;
}
Tôi thấy các tiêu chí được thêm vào với một OR
SELECT `e`.*, IF(at_status.value_id > 0, at_status.value, at_status_default.value) AS `status`, IF(at_visibility.value_id > 0, at_visibility.value, at_visibility_default.value) AS `visibility`
FROM `catalog_product_entity` AS `e`
INNER JOIN `catalog_product_entity_int` AS `at_status_default` ON (`at_status_default`.`entity_id` = `e`.`entity_id`) AND (`at_status_default`.`attribute_id` = '94') AND `at_status_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_int` AS `at_status` ON (`at_status`.`entity_id` = `e`.`entity_id`) AND (`at_status`.`attribute_id` = '94') AND (`at_status`.`store_id` = 1)
INNER JOIN `catalog_product_entity_int` AS `at_visibility_default` ON (`at_visibility_default`.`entity_id` = `e`.`entity_id`) AND (`at_visibility_default`.`attribute_id` = '96') AND `at_visibility_default`.`store_id` = 0 LEFT JOIN `catalog_product_entity_int` AS `at_visibility` ON (`at_visibility`.`entity_id` = `e`.`entity_id`) AND (`at_visibility`.`attribute_id` = '96') AND (`at_visibility`.`store_id` = 1)
WHERE ((`e`.`sku` = '24-MB01') OR (`e`.`sku` = 'WT08-XS-Black'))
Đây có phải là một lỗi? Có cách nào (thiếu dựa vào các bộ sưu tập sản phẩm và bỏ các kho lưu trữ) để làm cho công việc này không?