Magento 2.1.1 วิธีโหลดคำสั่งซื้อด้วยรหัสเพิ่มโดยใช้ออบเจกต์ OrderRepository


19

สิ่งที่จะเป็นวิธีที่ดีที่สุดล่าสุดในการสั่งซื้อที่เพิ่มขึ้นในการโหลดโดยใช้ ID (แทนรหัสคำสั่งซื้อ) โดยใช้OrderRepository


2
ไม่ใช่คำตอบที่ซ้ำกัน - คำตอบที่เชื่อมโยงนั้นเกี่ยวกับการเรียกคืนคำสั่งซื้อตามรหัสคำสั่งไม่ใช่โดยการเพิ่มรหัส
Fabian Schmengler

EKK! มีวิธีในการเลิกทำเครื่องหมายว่าซ้ำกันหรือไม่ ฉันตั้งใจจะทำเครื่องหมายคำตอบด้านล่างนี้เป็นคำตอบของคำตอบ
frostshoxx

1
ช้าเกินไปตอนนี้ก็ปิดไปแล้ว แต่ฉันเสนอคำถามให้เปิดใหม่
Fabian Schmengler

คำตอบ:


32

Magento 2 ใช้สัญญาบริการสำหรับการดึงและบันทึกวัตถุ ใน Magento เลเยอร์นี้ถูกสร้างขึ้นโดยที่เก็บซึ่งเป็นผู้จัดการด้วยget()และsave()วิธีการ สิ่งนี้จะทำให้รหัสผู้ใช้อยู่ห่างจากการโทรแบบ อย่าเรียกวิธีการโมเดล (เช่นload()หรือsave()หรือloadByIncrementId()) โดยตรงพวกเขากำลังถูกคัดค้านเนื่องจากรหัสที่กำหนดเองควรใช้สัญญาบริการ นอกจากนี้อย่าใช้ API จากภายในวีโอไอพีอย่างที่ Khoa แนะนำ แต่ก็ไม่สมเหตุสมผล API สำหรับเชื่อมต่อ Magento กับระบบอื่น ๆ

Inject OrderRepository และ SearchCriteriaBuilder ใน Constructor ของคุณ:

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

และในการทำงานของคุณ:

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

คู่มือสำหรับนักพัฒนา Magento PHP อย่างเป็นทางการที่ magento.com

รหัสโดย Mulderea บน github


ฉันได้รับข้อผิดพลาดเช่น: ไม่สามารถใช้วัตถุประเภท Magento \ Sales \ Model \ ResourceModel \ Order \ Collection เป็นอาร์เรย์ที่ $ order = $ orderList [0];
Ashish Raj

มันแปลกมากฉันได้รับอาร์เรย์ คุณเป็นเวอร์ชั่นไหน แต่ด้วยคอลเล็กชันคุณสามารถแทนที่$order = $orderList[0]ด้วย$order = $orderList->getFirstItem()เพื่อรับไอเท็มแรก (และอย่างเดียว) จากคอลเล็กชัน
Jacques

ฉันอยู่ในเวอร์ชัน 2.1.3 และฉันจำเป็นต้องโหลดวัตถุใบสั่งสำหรับวัตถุการชำระเงินโหลด .. ฉันทำไปแล้ว$order = $orderList->getFirstItem(); $payment = $order->getPayment();แต่ไม่ได้รับอะไร$payment โปรดตรวจสอบปัญหาของฉันที่นี่magento.stackexchange.com/questions/158935/…
Ashish Raj

1
ฉันมีข้อผิดพลาดพร้อมคำตอบที่ยอมรับได้ สิ่งนี้แก้ไขได้ ขอบคุณสำหรับการแก้ปัญหาที่ดี
CompactCode

ใน Magento 2.3.x ฉันต้องได้รับคำสั่งด้วยวิธีนี้:$order = $orderList['000000001'];
ph.dev

20

\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;

}

โหลดวัตถุคำสั่งโดยรหัสที่เพิ่มขึ้น:

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

[แก้ไข]ควรลองทำสัญญาบริการ ลองคำตอบของ Jacco


3
โปรดอย่าใช้เครื่องหมายขีดล่างในชื่อตัวแปรของคุณ PHP มีตัวดัดแปลงการเข้าถึงตั้งแต่ PHP 5 ซึ่งตอนนี้อายุ 12 ปี คุณควรใช้วิธีการเขียนโปรแกรมที่ทันสมัยโดยเฉพาะคำตอบที่นี่
Jacques

1
ไม่ควรใช้วิธีนี้แม้ว่าจะใช้งานได้ก็ตาม ที่หนึ่ง: การฉีด di เป็นวัตถุที่ใช้ร่วมกันเว้นแต่ว่ามันจะไม่ระบุ; เมื่อใดก็ตามที่คุณแทรก OrderInterface คุณจะต้องใช้วัตถุเดียวกัน หากคุณต้องการใช้เส้นทางนี้จริงๆให้ใช้ OrderInterfaceFactory แล้วเรียกใช้ create () ประการที่สองคุณควรใช้สัญญาบริการตามคำตอบของ Jacco
Ian

2
รุ่น 2.2.2 การใช้งาน\Magento\Sales\Api\OrderRepositoryInterfaceและget()วิธีการ
LucScu

2
จะต้องพิจารณาสัญญาบริการ
Thiago Lima

1
@ ThiagoLima ใช่ฉันเห็นด้วยกับคุณ! ฉันยังโหวตให้ตอบสัญญาบริการ
Khoa TruongDinh
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.