【发布时间】:2021-08-07 18:34:20
【问题描述】:
我们正在使用 Shopware 6.3.5,并希望在产品导入(更新)期间替换属性。
我们指定产品 ID 和列表或属性 UUID(在 properties 列中)
目前,这些已添加到数据库中的现有属性中。
这似乎是由于导入期间upsert 调用的行为所致。
如何改变?
我们试过这个:
DI:
<argument type="service" id="product.repository"/>
方法:
class ImportSubscriber implements EventSubscriberInterface
{
private EntityRepositoryInterface $productRepository;
public function __construct(EntityRepositoryInterface $productRepository)
{
$this->productRepository = $productRepository;
}
public static function getSubscribedEvents(): array
{
return [
ImportExportBeforeImportRecordEvent::class => 'onImportExportBeforeImportRecord'
];
}
public function onImportExportBeforeImportRecord(ImportExportBeforeImportRecordEvent $event)
{
$this->productRepository->update([
[
'id' => $event->getRecord()['id'],
'property_ids' => null,
]
], $event->getContext());
}
}
但是这个更新语句导致\Shopware\Core\Framework\DataAbstractionLayer\Write\Command\WriteCommandQueue::ensureIs中的\Shopware\Core\Framework\DataAbstractionLayer\Write\Command\WriteTypeIntendException
我也想知道这个 WriteCommandQueue 做了什么,如果它的级别太低,我想做什么?
此外,我想知道 property_ids 是否是要更改的正确字段,或者实际上我必须清除该导入行的 product_property 表?
编辑
接下来我尝试了这个
DI:
<argument type="service" id="product_property.repository"/>
方法:
public function onImportExportBeforeImportRecord(ImportExportBeforeImportRecordEvent $event)
{
$existing = $this->productPropertryRepository->search(
(new Criteria())->addFilter(new EqualsFilter('productId', $event->getRecord()['id'])),
$event->getContext()
);
$entities = $existing->getEntities();
foreach($entities as $entity) {
$this->productPropertryRepository->delete([
[
'productId' => $event->getRecord()['id'],
'optionId' => $entity->get('optionId')
]
], $event->getContext());
}
}
但我得到了一个
Shopware\Core\Framework\DataAbstractionLayer\Exception\MappingEntityClassesException 与
Mapping definition neither have entities nor collection.
【问题讨论】: