मैगेंटो 2.1.1 ऑर्डररिपोसिटरी ऑब्जेक्ट का उपयोग करके इंक्रीमेंट आईडी के साथ ऑर्डर कैसे लोड करें


19

ऑर्डररीप्रोज़िटरी का उपयोग करके इंक्रीमेंट आईडी (ऑर्डर आईडी के बजाय) का उपयोग करके ऑर्डर को लोड करने के लिए नवीनतम सर्वोत्तम अभ्यास क्या होगा


2
डुप्लिकेट नहीं - जुड़ा हुआ उत्तर ऑर्डर आईडी द्वारा ऑर्डर प्राप्त करने के बारे में है, इंक्रीमेंट आईडी द्वारा नहीं
फेबियन शेंगलर

EKK! क्या डुप्लिकेट के रूप में निशान को पूर्ववत करने का एक तरीका है? मेरा मतलब समाधान के उत्तर के रूप में नीचे दिए गए उत्तर को चिह्नित करना था।
फ्रॉस्टशोक्स 20

1
बहुत देर हो चुकी है, अब यह पहले से ही बंद है। लेकिन मैंने सवाल को फिर से खोलने के लिए नामांकित किया।
फेबियन शेंगलर

जवाबों:


32

Magento 2 वस्तुओं को पुनः प्राप्त करने और सहेजने के लिए सेवा अनुबंध का उपयोग करता है। Magento में यह परत रिपोजिटरी द्वारा बनाई गई है, जो कि प्रबंधकों get()और save()विधियों के साथ हैं । यह यूजर कोड को मॉडल कॉल से दूर रखता है। मॉडल विधियों (जैसे load()या save()या loadByIncrementId()) को सीधे कॉल न करें , उन्हें हटा दिया जा रहा है क्योंकि कस्टम कोड को सेवा अनुबंध का उपयोग करना चाहिए। इसके अलावा, Magoa के भीतर से API का उपयोग न करें जैसे कि खोआ सुझाव दे रहा है, इसका कोई मतलब नहीं है। एपीआई Magento को अन्य प्रणालियों से जोड़ने के लिए है।

अपने कंस्ट्रक्टर में ऑर्डरRepository और SearchCriteriaBuilder को इंजेक्ट करें:

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.com पर आधिकारिक Magento PHP डेवलपर गाइड

Github पर Mulderea द्वारा कोड


मुझे इस तरह की त्रुटि हो रही है: $ ऑर्डर पर सरणी के रूप में Magento \ Sales \ Model \ ResourceModel \ Order \ Collection की वस्तु का उपयोग नहीं किया जा सकता है = $ ऑर्डरलिस्ट [0];
आशीष राज

यह अजीब है, मुझे एक सरणी मिली। आप किस संस्करण पर हैं? लेकिन एक संग्रह के साथ आप सिर्फ जगह ले सकता है $order = $orderList[0]के साथ $order = $orderList->getFirstItem()संग्रह से पहले (और केवल) आइटम प्राप्त करने के लिए।
जैक्स

मैं संस्करण 2.1.3 में हूं। और मुझे लोड भुगतान ऑब्जेक्ट के लिए ऑर्डर ऑब्जेक्ट लोड करने की आवश्यकता है .. मैंने किया है, $order = $orderList->getFirstItem(); $payment = $order->getPayment();लेकिन $payment कृपया मेरी समस्या की जांच करने के लिए यहां कुछ भी नहीं प्राप्त कर रहा है यहां magento.stackexchange.com/questions/158935/…
आशीष राज

1
मेरे पास स्वीकृत उत्तर के साथ एक बग था। इससे यह हल हो गया। अच्छे समाधान के लिए धन्यवाद
कॉम्पैक्टकोड

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

[EDIT] को सेवा अनुबंधों के साथ प्रयास करना चाहिए। जैको के जवाब की कोशिश करो।


3
कृपया अपने चर नामों में अंडरस्कोर का उपयोग न करें। PHP में PHP 5 के बाद से एक्सेस मॉडिफायर है, जो अब 12 साल का है। आपको आधुनिक प्रोग्रामिंग प्रथाओं का उपयोग करना चाहिए, खासकर यहां जवाब में।
जैक्स

1
इस पद्धति का उपयोग नहीं किया जाना चाहिए भले ही यह "काम" करे। एक: di इंजेक्शन एक साझा वस्तु है जब तक कि यह निर्दिष्ट नहीं किया जाता है; जब भी आप OrderInterface डालें, आप ठीक उसी ऑब्जेक्ट का उपयोग करेंगे। यदि आप वास्तव में इस मार्ग का उपयोग करना चाहते हैं तो OrderInterfaceFactory और फिर कॉल क्रिएट () करें। दूसरा, आपको जैको के जवाब में सेवा अनुबंधों का उपयोग करना चाहिए।
इयान

2
संस्करण 2.2.2, उपयोग \Magento\Sales\Api\OrderRepositoryInterfaceऔर इसकी get()विधि
LucScu

2
सेवा अनुबंधों को ध्यान में रखा जाना चाहिए।
थियागो लीमा

1
@ThiagoLima हाँ, मैं आपसे सहमत हूँ! मैंने सेवा अनुबंध के जवाब को भी वोट दिया।
खोआ TruongDinh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.