Magento 2:如何按报价ID加载报价


Answers:


19

您可以在课程中插入的实例\Magento\Quote\Model\QuoteFactory

protected $quoteFactory;

public function __construct(
    ...
    \Magento\Quote\Model\QuoteFactory $quoteFactory,
    ....
) {
    ....
    $this->quoteFactory = $quoteFactory;
    ....
}

然后,您可以使用:

$quote = $this->quoteFactory->create()->load($quoteId);

现在应该可以使用,但是很快该load方法将消失,您需要使用服务合同。
这样就可以使用了\Magento\Quote\Api\CartRepositoryInterface
与上述相同,在您的课程中插入该课程的实例:

protected $quoteRepository;

public function __construct(
    ...
    \Magento\Quote\Api\CartRepositoryInterface $quoteRepository,
    ....
) {
    ....
    $this->quoteRepository = $quoteRepository;
    ....
}

并使用此:

$this->quoteRepository->get($quoteId);

如果您想查看代码的外观,则其实现\Magento\Quote\Api\CartRepositoryInterface\Magento\Quote\Model\QuoteRepository


@Marius,您好,在具有多个商店视图的情况下也可以使用吗?
马尼尼

我认为这会起作用
Marius

13

首先,您需要\Magento\Quote\Model\QuoteFactory在类构造函数中注入a :

protected $_quoteFactory;

public function __construct(
    ...
    \Magento\Quote\Model\QuoteFactory $quoteFactory
) {
    $this->_quoteFactory = $quoteFactory;
    parent::__construct(...);
}

然后,在您的课程中,您可以执行以下操作:

$this->_quoteFactory->create()->loadByIdWithoutStore($quoteId);

另外,您还可以使用以下方法加载报价:

  • loadActive($quoteId)加载相应的活动报价的位置(其中is_active= 1)
  • loadByCustomerId($customerId) 加载与客户ID相对应的有效报价。

注意:您也可以直接使用对象管理器来执行此操作,但不建议这样做:

$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStor‌​e($quoteId);

1
\Magento\Quote\Model\Quote是不可注射的类。我的意思是您可以注射,但这不是最好的主意。如果将此类注入其他2个类,则将它作为一个单例放入DI容器中;如果load在其中一个类中调用一次,则也将其“加载”到另一个类中。很可能您不想要那样。使用工厂代替。
马里斯(Marius)

@Marius这是当您同时处理M1和M2项目时发生的情况。您倾向于混合所有内容。感谢您的支持和+1的解决方案,这绝对是正确的服务合同方式
Raphael在Digital Pianism上

出于上述相同的原因,$this->_objectManager->get('Magento\Quote\Model\QuoteFactory')->create()->loadByIdWithoutStore($quoteId);您可以代替使用$this->_objectManager->create('Magento\Quote\Model\Quote')->loadByIdWithoutStore($quoteId);。调用getOM将导致单例。
马里斯(Marius)

@Marius我发现getvs create比使用M1单身更明显,但是我仍然倾向于滥用它们
Digital Pianism的Raphael在

不用担心 去过也做过。:)
Marius
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.