Magento 2: Ürün Depoları, Filtre Grupları ve `AND`


12

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 ORdeğil a olarak uygulandı AND. Bu sorgunun hiçbir şey döndürmemesini beklerdim.

Ben içine kazmak ise Magento\Catalog\Api\ProductRepositorysı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)?


2
Bu bölgeye henüz kişisel olarak bakmadım , ancak cyrillschumacher.com/2015/01/02/… faydalı olabilir.
Alan Kent

Yanıtlar:


15

Gerçek açıklama ( \Magento\Framework\Api\Search\FilterGroupdiyor phpDoc):

Mantıksal bir OR kullanarak iki veya daha fazla filtreyi birlikte gruplandırır

Bu, her birinde bir filtre bulunan iki grup oluşturmanız gerektiği anlamına gelir.


Bunu açıkladığınız için teşekkürler. Magento 2 :
-P'de

2

Magento 2'de aynı filtreler operatör FilterGroupkullanılarak eklenecektir OR. Ancak tüm operatör FilterGroupkullanılarak eklenecektir AND. Bu yüzden FilterGroupaşağıdaki gibi birden fazla s eklemeniz gerekir :

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$searchCriteria = $objectManager->create('\Magento\Framework\Api\SearchCriteria');
$filter = $objectManager->create('\Magento\Framework\Api\Filter');
$filter->setField('category_id');
$filter->setValue(array(1, 2, 3));
$filter->setConditionType('in');

$filterGroup = $objectManager->create('\Magento\Framework\Api\Search\FilterGroup');
$filterGroup->setFilters([$filter]);

$filterEnabled = $objectManager->create('\Magento\Framework\Api\Filter');
$filterEnabled->setField('status');
$filterEnabled->setValue(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
$filterEnabled->setConditionType('eq');

$filterGroupEnabled = $objectManager->create('\Magento\Framework\Api\Search\FilterGroup');
$filterGroupEnabled->setFilters([$filterEnabled]);


$searchCriteria->setFilterGroups([$filterGroup, $filterGroupEnabled]);

Arama kriterleri ile ilgili daha fazla detay ve mantıksal kombinasyonda Magento-2 Arama Kriterleri'ni bulabilirsiniz.


Bu yanlış. Mantık Havuz başına uygulanır.
Alan Storm

Merhaba @Alan Storm, bu test edilmiş bir çözümdür. Magento 2.1.0'daki varsayılan mağaza için test ettim. Yanlış beyan etmek için herhangi bir gerekçeniz var mı, efendim?
Kamal Singh


@Alan Storm, cevabımda bahsettiğim şey bu. Tüm Filtre Grupları AND operatörü kullanılarak birleştirilir ve tek Filtre Grubundaki Tüm Filtreler, Magento 2 arama kriterleri belgelerine göre OR operatörü kullanılarak birleştirilir. Bu çözümün varsayılan mağaza ile test edildiğinden bahsetmiştim. Yorumunuza göre bu cevabı yanlış yapan şey, anlamadım.
Kamal Singh

@KamelSingh Bağlantı verdiğim hata raporunu okudunuz mu? Amaçlanan davranışlarına bakılmaksızın, filtrelerin ve filtre gruplarının davranışı nihayetinde içinde bulundukları havuzun davranışına bağlıdır.
Alan Storm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.