shopware 6 如何使用他们的 ID 查询和捕获与订单相关的其他详细信息

shopware 6 how do I query and capture other details related to an order using their ids

提问人:tee 提问时间:6/30/2023 更新时间:6/30/2023 访问量:174

问:

您好,我一直在使用一个商店项目。我正在使用事件订阅者。在我的课堂上,我试图挑选商店里最新的订单

CheckoutOrderPlacedEvent::class => 'OnOrderReceived',

public function OnOrderReceived(CheckoutOrderPlacedEvent $event): void

我能够获得一些详细信息,例如有关订单的详细信息。但是当我试图捕捉细节时

"billing address". getOrder()->getBillingAddress()

 'salesChannel getOrder()->getSalesChannel()

它们是空的,但我能够获得它们各自的 IDS

$event->getOrder()->getSalesChannelId(),

$event->getOrder()->getBillingAddressId()

请问我如何使用此 IDS 进行查询以获取它们各自的详细信息?

谢谢

PHP Symfony 活动 购物商品6

评论


答:

1赞 dneustadt 6/30/2023 #1

分别注入 和 到您的订阅者中。然后使用存储库获取相应的实体。sales_channel.repositoryorder_address.repository

<services>
    <service id="Swag\BasicExample\Subscriber\MySubscriber">
        <argument type="service" id="sales_channel.repository"/>
        <argument type="service" id="order_address.repository"/>
        <tag name="kernel.event_subscriber"/>
    </service>
</services>
<?php declare(strict_types=1);

namespace Swag\BasicExample\Subscriber;

use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class MySubscriber implements EventSubscriberInterface
{
    public function __construct(
        private readonly EntityRepository $salesChannelRepository,
        private readonly EntityRepository $orderAddressRepository
    ) {
    }

    public static function getSubscribedEvents(): array
    {
        return [
            CheckoutOrderPlacedEvent::class => 'orderPlaced',
        ];
    }

    public function orderPlaced(CheckoutOrderPlacedEvent $event): void
    {
        $salesChannel = $this->salesChannelRepository
            ->search(new Criteria([$event->getOrder()->getSalesChannelId()]), $event->getContext())
            ->first();
        
        $orderBillingAddress = $this->orderAddressRepository
            ->search(new Criteria([$event->getOrder()->getBillingAddressId()]), $event->getContext())
            ->first();
        
        // ...
    }
}

评论

0赞 tee 6/30/2023
您好@dneustadt感谢您的解释。正在尝试您解释的内容,但随后从 MyCustomBundle\Subscriber\MySubscriber::__construct() 中的构造抛出异常:参数 #1 ($salesChannelRepository) 必须是给定的 Shopware\Core\Framework\DataAbstractionLayer\EntityRepository、Symfony\Bridge\Monolog\Logger 类型。可能是什么问题
0赞 dneustadt 6/30/2023
您注入了错误的服务作为第一个参数。参数的顺序很重要。services.xml
0赞 tee 6/30/2023
非常感谢您的解决方案,$salesChannel返回信息,但当我进行查询时,$orderBillingAddress返回信息。这可能意味着什么,我敢肯定我在下订单时已经装满了
0赞 tee 6/30/2023
在所有存储库中,我无法让运输和计费存储库正常工作,它返回了一个空数据集
0赞 tee 6/30/2023
没关系,我让它使用客户地址存储库工作