J'essaie d'utiliser un référentiel de produits pour récupérer une liste de produits. Je veux récupérer en fonction de deux filtres, combinés à un AND
critère, mais les choses ne semblent pas fonctionner. Est-ce que je ne comprends pas comment fonctionnent les groupes de filtres? Ou est-ce un bug qui devrait être signalé?
Plus précisément, (exemple stupide pour des raisons de simplicité), j'ai un constructeur où j'injecte un générateur de filtre, un générateur de groupe de filtres et un générateur de critères de recherche
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;
}
Ensuite, plus tard dans une méthode, j'utilise les constructeurs de filtres pour construire deux filtres
$filter1 = $this->filterBuilder->setField('sku')
->setValue('24-MB01')
->setConditionType('eq')
->create();
$filter2 = $this->filterBuilder->setField('sku')
->setValue('WT08-XS-Black')
->setConditionType('eq')
->create();
Ensuite, j'utilise le générateur de groupe de filtres pour créer un groupe de filtres composé de ces deux filtres
$filter_group = $this->filterGroupBuilder
->addFilter($filter1)
->addFilter($filter2)
->create();
Ensuite, j'ai utilisé un générateur de critères de recherche, définissez le groupe de filtres dessus
$criteria = $this->searchCriteriaBuilder
->setFilterGroups([$filter_group])
->setPageSize(100)
->create();
return $criteria
Enfin, lorsque j'utilise ce critère avec un référentiel produit (utilisé ailleurs, en laissant de côté constructeur et di pour éviter toute confusion)
/* @var Magento\Catalog\Api\ProductRepositoryInterface */
$list = $productRepository->getList($searchCriteria);
L'appel est réussi mais je récupère deux produits. c'est-à-dire que le filtre SKU a été appliqué comme un OR
, pas comme un AND
. Je m'attendrais à ce que cette requête ne renvoie rien.
Si je fouille dans la Magento\Catalog\Api\ProductRepository
classe et jette un œil à la sélection de la collection
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;
}
Je vois les critères ajoutés avec un 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'))
Est-ce un bug? Existe-t-il un moyen (à moins de s'appuyer directement sur les collections de produits et d'abandonner les référentiels) pour que cela fonctionne?
la source
Réponses:
Annotation réelle de
\Magento\Framework\Api\Search\FilterGroup
said (classe phpDoc):Cela signifie que vous devez créer deux groupes avec un filtre dans chacun.
la source
Dans Magento 2, tous les filtres
FilterGroup
seront ajoutés à l'aide de l'OR
opérateur. Mais tout leFilterGroup
sera ajouté à l'aide de l'AND
opérateur. Vous devrez donc ajouter plusieursFilterGroup
s comme ci-dessous:Pour plus de détails et des combinaisons logiques sur les critères de recherche, vous pouvez trouver sur Magento-2 Search Criteria
la source