Magento 2.1.1 Wie man eine Bestellung mit einer Inkrement-ID mit dem OrderRepository-Objekt lädt

19

Was wäre die neueste bewährte Methode , um eine Bestellung mithilfe der Inkrement-ID (anstelle der Bestell- ID) mithilfe von OrderRepository zu laden ?

Frostshoxx
quelle
2
Kein Duplikat - Bei der verknüpften Antwort geht es darum, die Bestellung anhand der Bestell-ID abzurufen, nicht anhand der inkrementellen ID.
Fabian Schmengler,
ekk! Gibt es eine Möglichkeit, die Markierung als Duplikat rückgängig zu machen? Ich wollte die Antwort unten als Antwort auf die Lösung markieren.
Frostshoxx
1
Zu spät, jetzt wo es schon geschlossen ist. Aber ich habe die Frage vorgeschlagen, die wieder geöffnet werden soll.
Fabian Schmengler

Antworten:

32

Magento 2 verwendet Serviceverträge zum Abrufen und Speichern von Objekten. In Magento wird diese Ebene von Repositories gebildet, die Manager mit get()und save()Methoden sind. Dadurch wird der Benutzercode von Model-Aufrufen ferngehalten. Rufen Sie Modellmethoden (wie load()oder save()oder loadByIncrementId()) nicht direkt auf, sie werden veraltet, da benutzerdefinierter Code die Serviceverträge verwenden sollte. Verwenden Sie die API auch nicht in Magento, wie Khoa vorschlägt, da dies keinen Sinn ergibt. Die API dient zur Verbindung von Magento mit anderen Systemen.

Injizieren Sie OrderRepository und SearchCriteriaBuilder in Ihren Konstruktor:

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

Und in Ihrer Funktion:

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

Offizieller Magento PHP Developer Guide auf magento.com

Code von Mulderea auf Github

Jacques
quelle
Ich erhalte folgende Fehlermeldung: Objekt vom Typ Magento \ Sales \ Model \ ResourceModel \ Order \ Collection kann nicht als Array bei $ order = $ orderList [0] verwendet werden.
Ashish Raj
Das ist seltsam, ich habe eine Reihe. Auf welcher Version bist du? Aber mit einer Sammlung können Sie einfach ersetzen $order = $orderList[0]mit $order = $orderList->getFirstItem()den ersten zu bekommen (und nur) Artikeln aus der Sammlung.
Jacques
Ich bin in Version 2.1.3. und ich laden , um Objekt müssen für Last Zahlung Objekt .. Ich habe getan , $order = $orderList->getFirstItem(); $payment = $order->getPayment();aber immer nichts $payment Überprüfen Sie bitte mein Problem hier magento.stackexchange.com/questions/158935/...
Ashish Raj
1
Ich hatte einen Fehler mit der akzeptierten Antwort. Das hat es gelöst. Vielen Dank für die gute Lösung
CompactCode
In Magento 2.3.x muss ich die Bestellung folgendermaßen $order = $orderList['000000001'];
abrufen
20

Soweit ich weiß, sollten wir verwenden \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;

}

Auftragsobjekt nach Inkrement-ID laden:

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

[EDIT] sollte es mit Serviceverträgen versuchen. Versuchen Sie Jaccos Antwort.

Khoa TruongDinh
quelle
3
Bitte verwenden Sie keine Unterstriche in Ihren Variablennamen. PHP hat seit PHP 5, das mittlerweile 12 Jahre alt ist, Zugriffsmodifikatoren. Sie sollten moderne Programmierpraktiken anwenden, insbesondere bei Antworten.
Jacques
1
Diese Methode sollte nicht angewendet werden, auch wenn sie "funktioniert". Erstens: Die Di-Injection ist ein gemeinsames Objekt, sofern nicht angegeben ist, dass dies nicht der Fall ist. Jedes Mal, wenn Sie OrderInterface einfügen, verwenden Sie genau dasselbe Objekt. Wenn Sie diesen Weg wirklich gehen möchten, verwenden Sie OrderInterfaceFactory und rufen Sie create () auf. Zweitens sollten Sie die Serviceverträge wie in Jaccos Antwort verwenden.
Ian
2
Version 2.2.2, Verwendung \Magento\Sales\Api\OrderRepositoryInterfaceund get()Methode
LucScu
2
Serviceverträge müssen berücksichtigt werden.
Thiago Lima
1
@ThiagoLima ja, ich habe dir zugestimmt! Ich habe auch die Antwort auf die Serviceverträge gewählt.
Khoa TruongDinh