Shopware 6自定义规则中如何获取客户关联的Ticket实体数据?
解决方案
1. 修正扩展字段的获取方式
你当前调用的getExtensions()返回的是所有扩展的集合,而不是你定义的工单关联。需要通过指定扩展字段名来获取:
$tickets = $scope->getSalesChannelContext()->getCustomer()->getExtension('ticket');
这里的ticket要和你在OneToManyAssociationField中定义的第一个参数完全一致。
2. 在规则中合法加载关联数据
由于OneToMany关联默认懒加载,且无autoload选项,你可以通过RuleScope提供的上下文获取仓库,重新加载客户并关联工单数据(这符合规则开发规范,不属于注入服务):
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\Rule\RuleScope; public function match(RuleScope $scope): bool { $customer = $scope->getSalesChannelContext()->getCustomer(); if (!$customer) { return false; } // 通过上下文获取客户仓库 $customerRepo = $scope->getContext()->getRepository(CustomerDefinition::class); // 构建查询条件,关联工单数据 $criteria = new Criteria([$customer->getId()]); $criteria->addAssociation('ticket'); // 关联名称需与定义的OneToMany字段名一致 // 重新加载包含工单的客户对象 $loadedCustomer = $customerRepo->search($criteria, $scope->getContext())->first(); if (!$loadedCustomer) { return false; } // 获取工单集合并编写匹配逻辑 $tickets = $loadedCustomer->getExtension('ticket'); return $tickets !== null && $tickets->count() > 0; // 示例:判断工单数量大于0 }
3. 全局自动关联(可选,注意性能)
如果需要所有场景下加载客户时都自动携带工单数据(不推荐高并发场景),可以在Customer扩展的关联定义中添加AutoJoin标志:
use Shopware\Core\Framework\DataAbstractionLayer\Field\Flag\AutoJoin; $collection->add( (new OneToManyAssociationField( 'ticket', TicketDefinition::class, 'customer_id', )) ->addFlags(new CascadeDelete()) ->addFlags(new AutoJoin()) // 添加自动关联标志 );
内容的提问来源于stack exchange,提问作者Marcin Puszka
相关产品推荐
相关产品推荐

