Magento 2.1.1 Come caricare l'Ordine con ID Incremento usando l'oggetto OrderRepository


19

Quale sarebbe la migliore procedura più recente per caricare l'ordine utilizzando l'ID incremento (anziché l'ID ordine) utilizzando OrderRepository


2
Non un duplicato : la risposta collegata riguarda il recupero dell'ordine per ID ordine, non per ID incremento
Fabian Schmengler,

Ekk! C'è un modo per annullare il segno come duplicato? Intendevo contrassegnare la risposta di seguito come risposta alla soluzione.
frostshoxx,

1
Troppo tardi, ora che è già chiuso. Ma ho nominato la domanda da riaprire.
Fabian Schmengler,

Risposte:


32

Magento 2 utilizza i Contratti di servizio per recuperare e salvare oggetti. In Magento questo livello è formato da Repository, che sono gestori con get()e save()metodi. Ciò mantiene il codice utente lontano dalle chiamate del modello. Non chiamare direttamente i metodi del modello (come load()o save()o loadByIncrementId()), sono deprecati poiché il codice personalizzato dovrebbe utilizzare i Contratti di servizio. Inoltre, non usare l'API all'interno di Magento come suggerisce Khoa, non ha senso. L'API serve per connettere Magento con altri sistemi.

Iniettare OrderRepository e SearchCriteriaBuilder nel costruttore:

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

E nella tua funzione:

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

Guida ufficiale per sviluppatori PHP Magento su magento.com

Codice di Mulderea su github


Ricevo un errore del tipo: Impossibile utilizzare l'oggetto di tipo Magento \ Sales \ Model \ ResourceModel \ Order \ Collection come array in $ order = $ orderList [0];
Ashish Raj,

È strano, ho un array. Su quale versione sei? Ma con una raccolta puoi semplicemente sostituirla $order = $orderList[0]con $order = $orderList->getFirstItem()per ottenere il primo (e unico) oggetto dalla raccolta.
Jacques,

Sono nella versione 2.1.3. e ho bisogno di caricare l'oggetto ordine per caricare l'oggetto pagamento .. L'ho fatto $order = $orderList->getFirstItem(); $payment = $order->getPayment();Ma non riesco a entrare Non $payment controllare il mio problema qui magento.stackexchange.com/questions/158935/…
Ashish Raj

1
Ho avuto un bug con la risposta accettata. Questo ha risolto. Grazie per la buona soluzione
CompactCode

In Magento 2.3.x ho bisogno di ottenere l'ordine in questo modo:$order = $orderList['000000001'];
ph.dev

20

Per quanto ne so, dovremmo usare \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;

}

Carica oggetto ordine per ID incremento:

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

[EDIT] dovrebbe provare con contratti di servizio. Prova la risposta di Jacco.


3
Si prega di non utilizzare i trattini bassi nei nomi delle variabili. PHP ha avuto modificatori di accesso da PHP 5, che ora ha 12 anni. Dovresti usare le moderne pratiche di programmazione, specialmente nelle risposte qui.
Jacques,

1
Questo metodo non deve essere utilizzato anche se "funziona". Uno: la di injection è un oggetto condiviso a meno che non sia specificato per non esserlo; ogni volta che inserisci OrderInterface in userai esattamente lo stesso oggetto. Se vuoi davvero seguire questa strada usa OrderInterfaceFactory e poi chiama create (). Secondo, dovresti usare i contratti di servizio come nella risposta di Jacco.
Ian,

2
versione 2.2.2, utilizzare \Magento\Sales\Api\OrderRepositoryInterfacee il suo get()metodo
LucScu

2
i contratti di servizio devono essere presi in considerazione.
Thiago Lima,

1
@ThiagoLima si, sono d'accordo con te! Ho anche votato la risposta ai contratti di servizio.
Khoa TruongDinh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.