Magento 2.1.1如何使用OrderRepository对象加载带有增量ID的订单


19

什么是用增量ID来加载顺序最新的最佳实践使用(而不是订单ID)OrderRepository


2
不是重复的 -链接的答案是关于按订单ID而不是按增量ID检索订单
Fabian Schmengler 2016年

kk!有没有办法撤销标记为重复的标记?我打算将以下答案标记为解决方案的答案。
frostshoxx

1
现在已经关闭,为时已晚。但是我提名了要重新开始的问题。
Fabian Schmengler '16

Answers:


32

Magento 2使用服务合同来检索和保存对象。在Magento中,此层由存储库组成,该存储库是具有get()save()方法的管理器。这样可以使用户代码远离Model调用。不要直接调用模型方法(例如load()save()loadByIncrementId()),因为建议使用服务合同的自定义代码已被弃用。另外,不要像Khoa所建议的那样从Magento内部使用API​​,这没有道理。该API用于将Magento与其他系统连接。

在构造函数中注入OrderRepository和SearchCriteriaBuilder:

private $orderRepository;
private $searchCriteriaBuilder;

public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Sales\Model\OrderRepository $orderRepository,
        \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder
){
$this->orderRepository = $orderRepository;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
parent::__construct($context);
}

并在您的职能:

$searchCriteria = $this->searchCriteriaBuilder
    ->addFilter('increment_id', '000000001', 'eq')->create();
$orderList = $this->orderRepository->getList($searchCriteria)->getItems();

// $orderList is now an array of Orders with this incrementId, which is just one order obviously

/** @var \Magento\Sales\Model\Order $order */
$order = $orderList[0];
// Your logic here
$order = $this->orderRepository->save($order);

magento.com上的官方Magento PHP开发人员指南

Mulderea在github上的代码


我收到类似这样的错误:无法在$ order = $ orderList [0]处将类型为Magento \ Sales \ Model \ ResourceModel \ Order \ Collection的对象用作数组。
Ashish Raj

奇怪,我得到一个数组。您在哪个版本上?但是对于集合,您可以替换$order = $orderList[0]$order = $orderList->getFirstItem()以从集合中获取第一个(也是唯一一个)项目。
雅克

我的版本是2.1.3。我需要加载顺序对象负载的支付对象。我已经做了$order = $orderList->getFirstItem(); $payment = $order->getPayment();,但在得到什么$payment 请点击这里查看我的问题magento.stackexchange.com/questions/158935/...
阿希什拉吉

1
我的错误答案被接受。这解决了。感谢您提供的好解决方案
CompactCode '18

在Magento 2.3.x中,我需要以这种方式获得订单:$order = $orderList['000000001'];
ph.dev

20

据我所知,我们应该使用\Magento\Sales\Api\Data\OrderInterface

/** @var \Magento\Sales\Api\Data\OrderInterfaceFactory $order **/

protected $orderFactory;

public function __construct(
    \Magento\Sales\Api\Data\OrderInterfaceFactory $orderFactory,
    ......
) {
    $this->orderFactory = $orderFactory;

}

按增量ID加载订单对象:

$this->orderFactory->create()->loadByIncrementId('00001952-42');

[EDIT]应该尝试使用服务合同。尝试雅科的答案。


3
请不要在变量名中使用下划线。自PHP 5至今已有12年的历史了,PHP有了访问修饰符。您应该使用现代编程实践,尤其是在此处的答案中。
雅克

1
即使“有效”,也不应使用此方法。一个:di注入是一个共享对象,除非指定为不是。每当您在其中插入OrderInterface时,都将使用完全相同的对象。如果您确实想走这条路线,请使用OrderInterfaceFactory,然后调用create()。其次,您应该按照雅科的答案使用服务合同。
伊恩

2
版本2.2.2,使用\Magento\Sales\Api\OrderRepositoryInterface及其get()方法
LucScu

2
服务合同必须考虑在内。
Thiago Lima

1
@ThiagoLima是的,我同意你的意见!我还对服务合同的答案进行了投票。
Khoa TruongDinh '18年
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.