Magento 2: Filtrar la colección de productos por múltiples categorías (Magento 2.1)

10

Estoy usando Magento 2.1.0 y actualmente tengo dificultades para filtrar la colección de productos con varias categorías. He usado más de un par de formas para que funcione, pero no lo hará.

Asumiendo:

$catalog_ids = [618, 619, 620];
  1. Devuelve NULL

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addCategoriesFilter(array('in' => $catalog_ids));
  2. Devuelve la excepción: Nombre de atributo no válido: category_id

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_id', array(
            'finset' => $catalog_ids
        ));
  3. Devuelve error de sintaxis o infracción de acceso

    $productCollection = $this->productCollectionFactory->create()
        ->addAttributeToSelect('*')
        ->addAttributeToFilter('category_ids', array(
            'finset' => $catalog_ids
        ));

¿Algún consejo sobre cómo podría hacer que esto funcione o que algo vincule este trabajo?

Morgy
fuente
Intenta verificar el sql generado. $ productCollection-> getSelectSql (verdadero);
Arkadii Chyzhov

Respuestas:

13

Probablemente esté acostumbrado al $thisparadigma de "cada método devuelve " de Magento 1. Este ya no es el caso (al menos no siempre).

Específicamente, addCategoriesFilter()no devuelve nada y es por eso que obtienes null.

Cambia el código a:

$productCollection = $this->productCollectionFactory->create();
$productCollection->addAttributeToSelect('*');
$productCollection->addCategoriesFilter(array('in' => $catalog_ids));
Fabian Schmengler
fuente
3
Sugerir que ya no es el caso probablemente se afirma con demasiada fuerza. La función 'addCategoryFilter' (singular) en la misma clase devuelve $ this; por lo tanto, agregar el valor de retorno en 'addCategoriesFilter' probablemente acaba de escapar de la atención de un desarrollador.
Patrick van Bergen
sí, eso también tendría sentido
Fabian Schmengler
2

Su primer intento es definitivamente la forma correcta de hacerlo:

$values = [318, 619, 620];
$conditionType = "in";
$productCollection->addCategoriesFilter([$conditionType => $values]);

Ahora hay dos cosas que asegurar: $productCollectiondebe ser una instancia Magento\Catalog\Model\ResourceModel\Product\Collectionpara que esto funcione (o de una clase que lo extienda).

Y, obviamente, necesita tener productos en la catalog_category_producttabla que coincidan con esa condición, tal vez ese no sea el caso y es por eso que obtiene NULL.

Raphael en Digital Pianism
fuente
¿Cuál es la mejor manera de usar la recolección de productos o los contratos de servicio? Magento \ Catálogo \ Api \ Datos \ ProductSearchResultsInterface
MagePsycho
@MagePsycho si tienes la opción, siempre busca contratos de servicio;)
Raphael en Digital Pianism