Ich versuche, ein Produkt-Repository zu verwenden, um eine Liste der Produkte abzurufen. Ich möchte basierend auf zwei Filtern, kombiniert mit einem AND
Kriterium, holen , aber die Dinge scheinen nicht zu funktionieren. Verstehe ich nicht, wie Filtergruppen funktionieren? Oder ist dies ein Fehler, der gemeldet werden sollte?
Insbesondere (der Einfachheit halber ein albernes Beispiel) habe ich einen Konstruktor, in den ich einen Filterbuilder, einen Filtergruppenbuilder und einen Suchkriterienbuilder einfüge
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;
}
Später in einer Methode verwende ich dann die Filterbuilder, um zwei Filter zu erstellen
$filter1 = $this->filterBuilder->setField('sku')
->setValue('24-MB01')
->setConditionType('eq')
->create();
$filter2 = $this->filterBuilder->setField('sku')
->setValue('WT08-XS-Black')
->setConditionType('eq')
->create();
Anschließend benutze ich den Builder für Filtergruppe, um eine Filtergruppe zu erstellen, die aus diesen beiden Filtern besteht
$filter_group = $this->filterGroupBuilder
->addFilter($filter1)
->addFilter($filter2)
->create();
Dann habe ich einen Builder für Suchkriterien verwendet und die Filtergruppe darauf festgelegt
$criteria = $this->searchCriteriaBuilder
->setFilterGroups([$filter_group])
->setPageSize(100)
->create();
return $criteria
Schließlich, wenn ich dieses Kriterium mit einem Produkt-Repository verwende (anderswo verwendet, Konstruktor und di weglassen, um Verwirrung zu vermeiden)
/* @var Magento\Catalog\Api\ProductRepositoryInterface */
$list = $productRepository->getList($searchCriteria);
Der Anruf ist erfolgreich, aber ich erhalte zwei Produkte zurück. Das heißt, der SKU-Filter wurde als OR
, nicht als angewendet AND
. Ich würde erwarten, dass diese Abfrage nichts zurückgibt.
Wenn ich mich in die Magento\Catalog\Api\ProductRepository
Klasse vertiefe, schaue ich mir die ausgewählte Aussage der Sammlung an
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;
}
Ich sehe die Kriterien mit einem 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'))
Ist das ein Bug? Gibt es eine Möglichkeit (sich nicht nur direkt auf die Produktkollektionen zu verlassen und die Repositories zu vernichten), um diese Funktion zu erfüllen?
quelle
Antworten:
Tatsächliche Annotation von
\Magento\Framework\Api\Search\FilterGroup
says (Klasse phpDoc):Dies bedeutet, dass Sie zwei Gruppen mit jeweils einem Filter erstellen müssen.
quelle
In Magento 2 werden alle darin enthaltenen Filter
FilterGroup
mithilfe desOR
Operators hinzugefügt . Aber alleFilterGroup
werden mitAND
operator hinzugefügt . Sie müssen also mehrereFilterGroup
s wie folgt hinzufügen :Weitere Details und logische Kombinationen zu Suchkriterien finden Sie unter Magento-2- Suchkriterien
quelle