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

frostshoxx
sumber
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

Jacques
sumber
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.

Khoa TruongDinh
sumber
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