Magento 2.1.1 Jak załadować zamówienie z identyfikatorem przyrostu za pomocą obiektu OrderRepository

19

Jaka jest najnowsza najlepsza praktyka ładowania zamówienia przy użyciu identyfikatora przyrostu (zamiast identyfikatora zamówienia) przy użyciu OrderRepository

frostshoxx
źródło
2
Nie duplikat - połączona odpowiedź dotyczy pobierania zamówienia według identyfikatora zamówienia, a nie inkrementacji
Fabian Schmengler
ekk! Czy istnieje sposób cofnięcia oznaczenia jako duplikatu? Chciałem zaznaczyć odpowiedź poniżej jako odpowiedź na rozwiązanie.
frostshoxx
1
Za późno, teraz jest już zamknięty. Ale wyznaczyłem pytanie do ponownego otwarcia.
Fabian Schmengler,

Odpowiedzi:

32

Magento 2 wykorzystuje umowy serwisowe do wyszukiwania i zapisywania obiektów. W Magento warstwa ta jest tworzona przez Repozytoria, które są menedżerami get()i save()metodami. To utrzymuje kod użytkownika z dala od wywołań modeli. Nie należy wywoływać metod modelowych (takich jak load()lub save()lub loadByIncrementId()) bezpośrednio, ponieważ są one przestarzałe, ponieważ niestandardowy kod powinien wykorzystywać umowy serwisowe. Nie używaj również API z Magento, jak sugeruje Khoa, to nie ma sensu. Interfejs API służy do łączenia Magento z innymi systemami.

Wstrzykiwanie OrderRepository i SearchCriteriaBuilder w swoim konstruktorze:

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);
}

I w twojej funkcji:

$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);

Oficjalny przewodnik programisty PHP Magento na magento.com

Kod Mulderea na github

Jacques
źródło
Pojawia się błąd: Nie można użyć obiektu typu Magento \ Sales \ Model \ ResourceModel \ Order \ Collection jako tablicy o wartości $ order = $ orderList [0];
Ashish Raj,
To dziwne, mam tablicę. Której wersji używasz? Ale dzięki kolekcji możesz po prostu zastąpić $order = $orderList[0]ją, $order = $orderList->getFirstItem()aby uzyskać pierwszy (i jedyny) przedmiot z kolekcji.
Jacques
Jestem w wersji 2.1.3. i muszę załadować obiekt zamówienia dla obiektu płatności obciążenia .. Zrobiłem $order = $orderList->getFirstItem(); $payment = $order->getPayment();Ale nic nie dostałem $payment Proszę sprawdzić mój problem tutaj magento.stackexchange.com/questions/158935/…
Ashish Raj
1
Miałem błąd z zaakceptowaną odpowiedzią. To rozwiązało. Dzięki za dobre rozwiązanie
CompactCode
W Magento 2.3.x muszę otrzymać zamówienie w ten sposób:$order = $orderList['000000001'];
ph.dev
20

O ile mi wiadomo, powinniśmy użyć \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;

}

Załaduj obiekt zamówienia według identyfikatora przyrostu:

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

[EDYCJA] powinna spróbować z kontraktami serwisowymi. Spróbuj odpowiedzi Jacco.

Khoa TruongDinh
źródło
3
Nie używaj podkreślników w nazwach zmiennych. PHP ma modyfikatory dostępu od PHP 5, który ma teraz 12 lat. Powinieneś stosować nowoczesne praktyki programowania, szczególnie w odpowiedziach tutaj.
Jacques
1
Ta metoda nie powinna być używana, nawet jeśli „działa”. Po pierwsze: wtrysk di jest obiektem współdzielonym, chyba że określono, że ma być inny; za każdym razem, gdy wstawisz OrderInterface, będziesz używać dokładnie tego samego obiektu. Jeśli naprawdę chcesz wybrać tę trasę, użyj OrderInterfaceFactory, a następnie wywołaj metodę create (). Po drugie, powinieneś korzystać z umów serwisowych jak w odpowiedzi Jacco.
Ian
2
wersja 2.2.2, użycie \Magento\Sales\Api\OrderRepositoryInterfacei jego get()metoda
LucScu
2
należy wziąć pod uwagę umowy o świadczenie usług.
Thiago Lima,
1
@ThiagoLima tak, zgodziłem się z tobą! Głosowałem również nad odpowiedzią na umowy o świadczenie usług.
Khoa TruongDinh