Estoy tratando de usar un repositorio de productos para obtener una lista de productos. Quiero obtener en función de dos filtros, combinados con un AND
criterio, pero las cosas no parecen funcionar. ¿No entiendo cómo funcionan los grupos de filtros? ¿O se trata de un error que se debe informar?
Específicamente, (ejemplo tonto por simplicidad) tengo un constructor donde inyecto un generador de filtros, un generador de grupos de filtros y un generador de criterios de búsqueda
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;
}
Luego, más adelante en un método, uso los creadores de filtros para construir dos filtros
$filter1 = $this->filterBuilder->setField('sku')
->setValue('24-MB01')
->setConditionType('eq')
->create();
$filter2 = $this->filterBuilder->setField('sku')
->setValue('WT08-XS-Black')
->setConditionType('eq')
->create();
Luego uso el generador de grupos de filtros para crear un grupo de filtros que consta de estos dos filtros
$filter_group = $this->filterGroupBuilder
->addFilter($filter1)
->addFilter($filter2)
->create();
Luego usé un generador de criterios de búsqueda, configuré el grupo de filtros
$criteria = $this->searchCriteriaBuilder
->setFilterGroups([$filter_group])
->setPageSize(100)
->create();
return $criteria
Finalmente, cuando uso este criterio con un repositorio de productos (usado en otro lugar, omitiendo constructor y di para evitar confusiones)
/* @var Magento\Catalog\Api\ProductRepositoryInterface */
$list = $productRepository->getList($searchCriteria);
La llamada es exitosa pero recibo dos productos. es decir, el filtro SKU se aplicó como a OR
, no como AND
. Espero que esta consulta no devuelva nada.
Si profundizo en la Magento\Catalog\Api\ProductRepository
clase y miro la declaración selecta de la colección
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;
}
Veo los criterios agregados con 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'))
¿Es esto un error? ¿Hay alguna manera (salvo depender directamente de las colecciones de productos y deshacerse de los repositorios) para que esto funcione?
fuente
Respuestas:
Anotación real de
\Magento\Framework\Api\Search\FilterGroup
say (clase phpDoc):Significa que necesita crear dos grupos con un filtro en cada uno.
fuente
En Magento 2, todos los filtros en el mismo
FilterGroup
se agregarán utilizando elOR
operador. Pero todoFilterGroup
se agregará utilizando elAND
operador. Por lo tanto, deberá agregar variosFilterGroup
s como se muestra a continuación:En más detalles y combinaciones lógicas sobre los criterios de búsqueda, puede encontrar en Magento-2 Search Criteria
fuente