Magento 2.1.1 Как загрузить Order с ID приращения с помощью объекта OrderRepository

19

Какова будет последняя рекомендация по загрузке заказа с использованием идентификатора приращения (вместо идентификатора заказа) с использованием OrderRepository

frostshoxx
источник
2
Не дубликат - связанный ответ о получении заказа по идентификатору заказа, а не по инкрементному идентификатору
Фабиан Шменглер
EKK! Есть ли способ отменить метку как дубликат? Я хотел отметить ответ ниже как ответ на решение.
frostshoxx
1
Слишком поздно, теперь, когда он уже закрыт. Но я выдвинул вопрос, который будет вновь открыт.
Фабиан Шменглер

Ответы:

32

Magento 2 использует контракты на обслуживание для извлечения и сохранения объектов. В Magento этот слой образован репозиториями, которые являются менеджерами get()и save()методами. Это удерживает код пользователя от вызовов модели. Не вызывайте методы модели (например, load()или save()или loadByIncrementId()) напрямую, они устарели, поскольку пользовательский код должен использовать контракты на обслуживание. Кроме того, не используйте API из Magento, как предлагает Khoa, это не имеет смысла. 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 PHP на magento.com

Код Mulderea на github

Жак
источник
Я получаю сообщение об ошибке вроде: Не удается использовать объект типа Magento \ Sales \ Model \ ResourceModel \ Order \ Collection в качестве массива в $ order = $ orderList [0];
Ашиш Радж
Странно, я получил массив. На какой версии вы находитесь? Но с коллекцией вы можете просто заменить $order = $orderList[0]с , $order = $orderList->getFirstItem()чтобы получить первый (и единственный) элемент из коллекции.
Жак
Я в версии 2.1.3. и мне нужно загрузить объект заказа для загрузки объекта оплаты. Я сделал, $order = $orderList->getFirstItem(); $payment = $order->getPayment();но ничего не получил. $payment Пожалуйста, проверьте мою проблему здесь magento.stackexchange.com/questions/158935/…
Ашиш Радж
1
У меня была ошибка с принятым ответом. Это решило это. Спасибо за хорошее решение
CompactCode
В 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');

[РЕДАКТИРОВАТЬ] следует попробовать с контрактами на обслуживание. Попробуйте ответ Жако.

Кхоа ЧыонгДинь
источник
3
Пожалуйста, не используйте подчеркивания в именах переменных. PHP имеет модификаторы доступа начиная с PHP 5, которому сейчас 12 лет. Вы должны использовать современные практики программирования, особенно в ответах здесь.
Жак
1
Этот метод не следует использовать, даже если он «работает». Первый: ди-инъекция является общим объектом, если не указано, что он не является; каждый раз, когда вы вставляете OrderInterface, вы будете использовать один и тот же объект. Если вы действительно хотите пойти по этому пути, используйте OrderInterfaceFactory, а затем вызовите create (). Во-вторых, вы должны использовать сервисные контракты, как в ответе Жако.
Ян
2
версия 2.2.2, использование \Magento\Sales\Api\OrderRepositoryInterfaceи ее get()метод
LucScu
2
договоры на обслуживание должны быть приняты во внимание.
Тьяго Лима
1
@ThiagoLima да, я с тобой согласен! Я также проголосовал за ответ контрактов на обслуживание.
Khoa TruongDinh