Bir ürün listesi almak için bir ürün deposu kullanmaya çalışıyorum. Bir AND
ölçütle birleştirilmiş iki filtreye dayanarak getirmek istiyorum , ancak işler işe yaramıyor gibi görünüyor. Filtre gruplarının nasıl çalıştığını anlamıyorum? Yoksa rapor edilmesi gereken bir hata mı?
Özellikle, (basitlik uğruna aptalca bir örnek) Bir filtre oluşturucu, filtre grubu oluşturucu ve bir arama kriteri oluşturucu enjekte ettiğim bir yapıcı var
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;
}
Daha sonra, daha sonra bir yöntemde, iki filtre oluşturmak için filtre oluşturucuları kullanıyorum
$filter1 = $this->filterBuilder->setField('sku')
->setValue('24-MB01')
->setConditionType('eq')
->create();
$filter2 = $this->filterBuilder->setField('sku')
->setValue('WT08-XS-Black')
->setConditionType('eq')
->create();
Sonra bu iki filtreden oluşan bir filtre grubu oluşturmak için filtre grubu oluşturucuyu kullanıyorum
$filter_group = $this->filterGroupBuilder
->addFilter($filter1)
->addFilter($filter2)
->create();
Sonra bir arama ölçüt oluşturucu kullandım, filtre grubunu ayarladım
$criteria = $this->searchCriteriaBuilder
->setFilterGroups([$filter_group])
->setPageSize(100)
->create();
return $criteria
Son olarak, bu kriterleri bir ürün havuzuyla kullandığımda (başka bir yerde kullanılır, karışıklığı önlemek için yapıcı ve di'yi dışarıda bırakır)
/* @var Magento\Catalog\Api\ProductRepositoryInterface */
$list = $productRepository->getList($searchCriteria);
Çağrı başarılı ama iki ürünü geri alıyorum. yani SKU filtresi bir olarak OR
değil a olarak uygulandı AND
. Bu sorgunun hiçbir şey döndürmemesini beklerdim.
Ben içine kazmak ise Magento\Catalog\Api\ProductRepository
sınıfı ve koleksiyonun seçkin statment bakmak
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;
}
Eklenen ölçütleri 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'))
Bu bir hata mı? Bu işi yapmanın bir yolu var mı (doğrudan ürün koleksiyonlarına güvenmek ve depolardan kurtulmak)?