Magento 2.1.1 Cara memuat Order dengan Increment ID menggunakan objek OrderRepository


19

Apa yang akan menjadi praktik terbaik terbaru untuk memuat Pesanan menggunakan ID kenaikan (bukan ID Pesanan) menggunakan OrderRepository


2
Bukan duplikat - jawaban yang ditautkan adalah tentang mengambil pesanan berdasarkan pesanan, bukan dengan penambahan
Fabian Schmengler

ekk! Apakah ada cara untuk membatalkan tanda sebagai duplikat? Saya bermaksud menandai jawaban di bawah ini sebagai jawaban untuk solusi.
frostshoxx

1
Terlambat, sekarang sudah ditutup. Tetapi saya menominasikan pertanyaan untuk dibuka kembali.
Fabian Schmengler

Jawaban:


32

Magento 2 menggunakan Kontrak Layanan untuk mengambil dan menyimpan objek. Dalam Magento lapisan ini dibentuk oleh Repositori, yang manajer dengan get()dan save()metode. Ini menjaga kode pengguna dari Panggilan model. Jangan panggil metode model (seperti load()atau save()atau loadByIncrementId()) secara langsung, mereka sudah ditinggalkan karena kode kustom harus menggunakan Kontrak Layanan. Juga, jangan gunakan API dari dalam Magento seperti yang disarankan Khoa, itu tidak masuk akal. API adalah untuk menghubungkan Magento dengan sistem lain.

Suntikkan OrderRepository dan SearchCriteriaBuilder di konstruktor Anda:

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

Dan dalam fungsi Anda:

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

Panduan Pengembang PHP Magento Resmi di magento.com

Kode oleh Mulderea di github


Saya mendapatkan pesan kesalahan seperti: Tidak dapat menggunakan objek bertipe Magento \ Sales \ Model \ ResourceModel \ Order \ Collection sebagai array di $ order = $ orderList [0];
Ashish Raj

Aneh, saya punya array. Kamu versi apa? Tetapi dengan koleksi Anda hanya bisa menggantinya $order = $orderList[0]dengan $order = $orderList->getFirstItem()untuk mendapatkan item pertama (dan hanya) dari koleksi.
Jacques

Saya di versi 2.1.3. dan saya perlu memuat objek pesanan untuk objek pembayaran pemuatan .. Saya telah melakukan $order = $orderList->getFirstItem(); $payment = $order->getPayment();Tapi tidak mendapatkan apa-apa di $payment Silakan periksa masalah saya di sini magento.stackexchange.com/questions/158935/…
Ashish Raj

1
Saya memiliki bug dengan jawaban yang diterima. Ini menyelesaikannya. Terima kasih atas solusi yang baik
CompactCode

Di Magento 2.3.x saya perlu memesan dengan cara ini:$order = $orderList['000000001'];
ph.dev

20

Sejauh yang saya tahu, kita harus menggunakan \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;

}

Muat objek pesanan dengan penambahan id:

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

[EDIT] harus mencoba dengan kontrak layanan. Coba jawaban Jacco.


3
Harap jangan gunakan garis bawah pada nama variabel Anda. PHP telah memiliki pengubah akses sejak PHP 5, yang sekarang berusia 12 tahun. Anda harus menggunakan praktik pemrograman modern, terutama dalam jawaban di sini.
Jacques

1
Metode ini tidak boleh digunakan bahkan jika "berhasil". Satu: injeksi di adalah objek yang dibagikan kecuali ditentukan tidak; kapan saja Anda memasukkan OrderInterface di Anda akan menggunakan objek yang sama persis. Jika Anda benar-benar ingin pergi rute ini menggunakan OrderInterfaceFactory dan kemudian panggil create (). Kedua, Anda harus menggunakan kontrak layanan seperti pada jawaban Jacco.
Ian

2
versi 2.2.2, gunakan \Magento\Sales\Api\OrderRepositoryInterfacedan get()metodenya
LucScu

2
kontrak layanan harus dipertimbangkan.
Thiago Lima

1
@ThiagoLima ya, saya setuju dengan Anda! Saya juga memilih jawaban kontrak layanan.
Khoa TruongDinh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.