You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 18:24:28