Magento 2.1.1 Як завантажити Order з інкрементним ідентифікатором за допомогою об’єкта OrderRepository


19

Яка була б остання найкраща практика для завантаження замовлення за допомогою ідентифікатора приросту (замість ідентифікатора замовлення) за допомогою OrderRepository


2
Не дублікат - відповідна відповідь стосується отримання замовлення за ідентифікатором замовлення, а не за збільшенням ідентифікатора
Fabian Schmengler

екк! Чи є спосіб скасувати позначку як дублікат? Я мав на меті позначити відповідь нижче як відповідь на рішення.
frostshoxx

1
Занадто пізно, тепер, коли він уже закритий. Але я висунув це питання для повторного відкриття.
Фабіан Шменглер

Відповіді:


32

Magento 2 використовує договори на обслуговування для отримання та збереження об'єктів. У Magento цей шар формується Репозиторіями, якими керують get()і save()методи. Це захищає код користувача від модельних дзвінків. Не називайте моделі методів (наприклад , load()чи save()або loadByIncrementId()) безпосередньо, вони в даний час НЕ рекомендуються в якості призначеного для користувача код повинен використовувати контракти на надання послуг. Крім того, не використовуйте API з Magento, як пропонує Khoa, це не має сенсу. API призначений для з'єднання Magento з іншими системами.

Введіть у свій конструктор замовлення репозиторію та пошукCriteriaBuilder:

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 \ Продажі \ Модель \ ResourceModel \ Order \ Collection як масив у $ order = $ orderList [0];
Ashish Raj

Це дивно, я отримав масив. На якій версії ви працюєте? Але з колекцією ви можете просто замінити $order = $orderList[0]з , $order = $orderList->getFirstItem()щоб отримати перший (і єдиний) елемент з колекції.
Жак

Я у версії 2.1.3. і мені потрібно завантажити об’єкт замовлення на об’єкт оплати вантажем. Я зробив, $order = $orderList->getFirstItem(); $payment = $order->getPayment();але нічого не отримую. $payment Будь ласка, перевірте мою проблему тут magento.stackexchange.com/questions/158935/…
Ashish Raj

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;

}

Завантажте об'єкт замовлення за збільшенням ідентифікатора:

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

[EDIT] повинен спробувати договори про надання послуг. Спробуйте відповідь Жакко.


3
Будь ласка, не використовуйте підкреслення в іменах змінних. З PHP 5, якому зараз 12 років, PHP має модифікатори доступу. Вам слід використовувати сучасні практики програмування, особливо у відповідях тут.
Жак

1
Цей метод не слід застосовувати, навіть якщо він "працює". Перший: ді-ін'єкція - це спільний об'єкт, якщо не вказано, що його немає; щоразу, коли ви вставите OrderInterface, ви будете використовувати той самий об’єкт. Якщо ви дійсно хочете пройти цей маршрут, використовуйте OrderInterfaceFactory, а потім зателефонуйте create (). По-друге, вам слід використовувати договори на обслуговування, як у відповіді Жако.
Ян

2
версія 2.2.2, використання \Magento\Sales\Api\OrderRepositoryInterfaceта його get()метод
LucScu

2
договори на обслуговування повинні враховуватися.
Тіаго Ліма

1
@ThiagoLima так, я погодився з тобою! Я також проголосував відповідь на договори на послуги.
Khoa TruongDinh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.