使用 Doctrine ind Akeneo 查询产品
Query products with Doctrine ind 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 (?)
正如您在声明中所见,该系列作为一个 Id 进行线程化。但是我想按家庭代码搜索。
我必须改变什么?
在 Pim/Component/Catalog/Model/AbstractProduct
中是 family 和 familyId 的属性。所以必须有一种查询家庭代码的方法。
也许相关,但这是 Akeneo 1.6 安装。
首先,要在 Akeneo 中查询产品,您应该使用 产品查询生成器 (PQB)。如果您使用的是 1.6,这里是使用它的文档的 link,非常简单:https://docs.akeneo.com/1.6/cookbook/catalog/product/query.html
要获得可用于 PQB 的属性和字段过滤器的详尽列表,您可以在 PIM 上使用 php app/console pim:product:query-help
命令。
正如您所注意到的,家庭不是一个属性而是一个字段,您可以在上面命令的字段过滤器中找到它:
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
}
我喜欢使用 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 (?)
正如您在声明中所见,该系列作为一个 Id 进行线程化。但是我想按家庭代码搜索。
我必须改变什么?
在 Pim/Component/Catalog/Model/AbstractProduct
中是 family 和 familyId 的属性。所以必须有一种查询家庭代码的方法。
也许相关,但这是 Akeneo 1.6 安装。
首先,要在 Akeneo 中查询产品,您应该使用 产品查询生成器 (PQB)。如果您使用的是 1.6,这里是使用它的文档的 link,非常简单:https://docs.akeneo.com/1.6/cookbook/catalog/product/query.html
要获得可用于 PQB 的属性和字段过滤器的详尽列表,您可以在 PIM 上使用 php app/console pim:product:query-help
命令。
正如您所注意到的,家庭不是一个属性而是一个字段,您可以在上面命令的字段过滤器中找到它:
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
}