Запрос продуктов с помощью Doctrine и Akeneo

Мне нравится получать некоторые продукты из базы данных с помощью пользовательской команды в akeneo. Я использую ProductRepositoryInterface

public function read()
{
    return $this->repository->findBy(
        [
            'enabled' => true,
            'family' => ['projector', 'projector_child', 'projector_parent'],
        ]
    );
}

А это сгенерированный запрос:

SELECT t0.id AS id1, t0.is_enabled AS is_enabled2, t0.created AS created3, t0.updated AS updated4, t0.family_id AS family_id5 FROM pim_catalog_product t0 WHERE t0.is_enabled = ? AND t0.family_id IN (?)

Как вы можете видеть в Заявлении, семейство связано с идентификатором. Но я хочу искать по семейному коду.

Что я должен изменить? В Pim/Component/Catalog/Model/AbstractProduct есть атрибут для семьи и familyId. Так что должен быть способ запросить семейный код.

Может и актуально, но это установка Akeneo 1.6.


person KFO    schedule 09.08.2018    source источник


Ответы (1)


Итак, во-первых, чтобы запросить продукты в Akeneo, вы должны использовать Product Query Builder (PQB). Если вы используете 1.6, вот ссылка на документацию по его использованию, это довольно просто: https://docs.akeneo.com/1.6/cookbook/catalog/product/query.html

Чтобы получить исчерпывающий список фильтров для атрибутов и полей, которые можно использовать с PQB, вы можете использовать команду php app/console pim:product:query-help в PIM.

Как вы заметили, семейство — это не атрибут, а поле, вы найдете его в фильтрах полей команды выше:

php app/console pim:product:query-help

Useable field filters...
+-----------------+--------------------------------+-----------------------------------------------------------+
| field           | operators                      | filter_class                                              |
+-----------------+--------------------------------+-----------------------------------------------------------+
| family          | IN, NOT IN, EMPTY, NOT EMPTY   | Pim\Bundle\CatalogBundle\Doctrine\ORM\Filter\FamilyFilter |
| family.id       | IN, NOT IN, EMPTY, NOT EMPTY   | Pim\Bundle\CatalogBundle\Doctrine\ORM\Filter\FamilyFilter |
| family.code     | IN, NOT IN, EMPTY, NOT EMPTY   | Pim\Bundle\CatalogBundle\Doctrine\ORM\Filter\FamilyFilter |
+-----------------+--------------------------------+-----------------------------------------------------------+

Теперь вы видите, что можете выполнять поиск в поле family.code.

Для вашего примера вы получите что-то вроде этого:

<?php
// Get a new instance of the PQB
$pqbFactory = $this->getContainer()->get('pim_catalog.query.product_query_builder_factory');
$pqb = $pqbFactory->create([
    'default_locale' => 'en_US',
    'default_scope' => 'ecommerce'
]);

// Now you can search for products with your family codes
$pqb->addFilter(
    'family.code',
    'IN',
    ['projector', 'projector_child', 'projector_parent']
);

// Retrieve your products
$productsCursor = $pqb->execute();
foreach ($productsCursor as $product) {
    // your custom logic
}
person grena    schedule 13.08.2018