Magento 2.1.1 OrderRepository nesnesini kullanarak Artış Kimliği ile Sipariş yükleme


19

Ne olurdu artım kimliği kullanarak yük Sipariş son iyi uygulama (yerine al ID'nin) kullanılarak OrderRepository


2
Yinelenen değil - bağlantılı cevap, sipariş kimliğiyle değil, sipariş kimliğine göre siparişin alınmasıyla ilgilidir
Fabian Schmengler

EKK! İşareti yinelenen olarak geri almanın bir yolu var mı? Aşağıdaki cevabı çözümün cevabı olarak işaretlemek istedim.
frostshoxx

1
Çok geç, şimdi zaten kapalı. Ama soruyu yeniden açılmak için aday gösterdim.
Fabian Schmengler

Yanıtlar:


32

Magento 2, nesneleri almak ve kaydetmek için Hizmet Sözleşmelerini kullanır. Magento'da bu katman yöneticiler get()ve save()yöntemler olan Depolar tarafından oluşturulur . Bu, kullanıcı kodunu Model çağrılarından uzak tutar. (Gibi bir model yöntemleri deme load()ya save()ya loadByIncrementId()özel kod Hizmet Sözleşmeleri kullanmalıdır olarak doğrudan, onlar kaldırılmış ediliyor). Ayrıca, Khoa'nın önerdiği gibi Magento içinden API'yi kullanmayın, mantıklı değil. API, Magento'yu diğer sistemlere bağlamak içindir.

Yapıcıya OrderRepository ve SearchCriteriaBuilder'ı enjekte edin:

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

Ve fonksiyonunuzda:

$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 resmi Magento PHP Geliştirici kılavuzu

Github'da Mulderea'nın Kodu


Gibi hata alıyorum: Magento \ Sales \ Model \ ResourceModel \ Order \ Collection türündeki nesne $ order = $ orderList [0] dizisi olarak kullanılamıyor;
Ashish Raj

Bu çok garip, bir dizim var. Hangi versiyondasın? Ancak bir koleksiyonla, koleksiyondaki ilk (ve yalnızca) öğeyi almak için $order = $orderList[0]bununla değiştirebilirsiniz $order = $orderList->getFirstItem().
Jacques

2.1.3 sürümündeyim. ve ben yük ödeme nesnesi için sipariş nesnesi yüklemeniz gerekiyor .. Ben yaptım $order = $orderList->getFirstItem(); $payment = $order->getPayment();Ama hiçbir şey alma $payment Lütfen benim sorun burada kontrol magento.stackexchange.com/questions/158935/…
Ashish Raj

1
Kabul edilen cevapta bir hata vardı. Bu çözdü. İyi çözüm için teşekkürler
CompactCode

Magento 2.3.x yılında bu şekilde sipariş almak gerekir:$order = $orderList['000000001'];
ph.dev

20

Bildiğim kadarıyla kullanmalıyız \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;

}

Sipariş nesnesini artan kimliğe göre yükle:

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

[EDIT] servis sözleşmelerini denemelidir. Jacco'nun cevabını dene.


3
Lütfen değişken adlarınızda alt çizgi kullanmayın. PHP, şu anda 12 yaşında olan PHP 5'ten beri erişim değiştiricilere sahiptir. Modern programlama uygulamalarını, özellikle buradaki cevaplarda kullanmalısınız.
Jacques

1
Bu yöntem "çalışıyor" olsa bile kullanılmamalıdır. Bir: di enjeksiyonu, belirtilmediği sürece paylaşılan bir nesnedir; OrderInterface öğesini her eklediğinizde aynı nesneyi kullanırsınız. Bu rotaya gerçekten gitmek istiyorsanız OrderInterfaceFactory kullanın ve ardından create () öğesini çağırın. İkinci olarak, servis sözleşmelerini Jacco'nun cevabında olduğu gibi kullanmalısınız.
Ian

2
sürüm 2.2.2, kullanımı \Magento\Sales\Api\OrderRepositoryInterfaceve get()yöntemi
LucScu

2
hizmet sözleşmeleri dikkate alınmalıdır.
Thiago Lima

1
@ThiagoLima evet, seninle aynı fikirdeyim! Hizmet sözleşmelerinin cevabına da oy verdim.
Khoa TruongDinh
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.