Magento 2.1.1 Cách tải Đơn hàng với ID tăng bằng cách sử dụng đối tượng OrderRep repository


19

Điều gì sẽ là cách thực hành tốt nhất mới nhất để tải Đơn hàng bằng cách sử dụng ID gia tăng (thay vì ID đơn hàng) bằng OrderRep repository


2
Không phải là một bản sao - câu trả lời được liên kết là về việc truy xuất đơn hàng theo id đơn hàng, không phải bằng id gia tăng
Fabian Schmengler

ek Có cách nào để hoàn tác đánh dấu là trùng lặp? Tôi có nghĩa là đánh dấu câu trả lời dưới đây là câu trả lời cho giải pháp.
frostshoxx

1
Quá muộn, bây giờ nó đã bị đóng cửa. Nhưng tôi đã đề cử câu hỏi để được mở lại.
Fabian Schmengler

Câu trả lời:


32

Magento 2 sử dụng Hợp đồng dịch vụ để truy xuất và lưu các đối tượng. Trong Magento, lớp này được hình thành bởi Kho lưu trữ, là các trình quản lý get()save()phương thức. Điều này giữ cho mã người dùng tránh xa các cuộc gọi Model. Đừng gọi các phương thức mô hình (như load()hoặc save()hoặc loadByIncrementId()) trực tiếp, chúng không được dùng nữa vì mã tùy chỉnh nên sử dụng Hợp đồng dịch vụ. Ngoài ra, đừng sử dụng API từ bên trong Magento như Khoa đang đề xuất, nó không có ý nghĩa gì. API dùng để kết nối Magento với các hệ thống khác.

Tiêm OrderRep repository và SearchCriteriaBuilder trong hàm tạo của bạn:

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

Và trong chức năng của bạn:

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

Hướng dẫn dành cho nhà phát triển PHP Magento chính thức trên magento.com

Mã của Mulderea trên github


Tôi gặp lỗi như: Không thể sử dụng đối tượng loại Magento \ Sales \ Model \ ResourceModel \ Order \ Collection dưới dạng mảng tại $ order = $ orderList [0];
Ashish Raj

Thật kỳ lạ, tôi có một mảng. Bạn đang dùng phiên bản nào? Nhưng với một bộ sưu tập, bạn chỉ có thể thay thế $order = $orderList[0]bằng $order = $orderList->getFirstItem()để có được mục đầu tiên (và duy nhất) từ bộ sưu tập.
Jacques

Tôi đang ở phiên bản 2.1.3. và tôi cần phải đối tượng để tải cho đối tượng thanh toán tải .. Tôi đã làm $order = $orderList->getFirstItem(); $payment = $order->getPayment();Nhưng nhận được gì trong $payment Vui lòng kiểm tra vấn đề của tôi ở đây magento.stackexchange.com/questions/158935/...
Ashish Raj

1
Tôi đã có một lỗi với câu trả lời được chấp nhận. Điều này đã giải quyết nó. Cảm ơn giải pháp tốt
CompactCode

Trong Magento 2.3.x tôi cần nhận đơn đặt hàng theo cách này:$order = $orderList['000000001'];
ph.dev

20

Theo tôi biết, chúng ta nên sử dụng \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;

}

Tải đối tượng thứ tự theo id tăng:

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

[EDIT] nên thử với các hợp đồng dịch vụ. Hãy thử câu trả lời của Jacco.


3
Vui lòng không sử dụng dấu gạch dưới trong tên biến của bạn. PHP đã có các sửa đổi truy cập kể từ PHP 5, hiện đã 12 tuổi. Bạn nên sử dụng thực hành lập trình hiện đại, đặc biệt là trong câu trả lời ở đây.
Jacques

1
Phương pháp này không nên được sử dụng ngay cả khi nó "hoạt động". Một: tiêm di là một đối tượng chia sẻ trừ khi nó được chỉ định là không; bất cứ khi nào bạn chèn OrderInterface vào bạn sẽ sử dụng cùng một đối tượng. Nếu bạn thực sự muốn đi tuyến đường này, hãy sử dụng OrderInterfaceFactory và sau đó gọi tạo (). Thứ hai, bạn nên sử dụng các hợp đồng dịch vụ như trong câu trả lời của Jacco.
Ian

2
phiên bản 2.2.2, sử dụng \Magento\Sales\Api\OrderRepositoryInterfaceget()phương thức của nó
LucScu

2
hợp đồng dịch vụ phải được xem xét.
Thiago Lima

1
@ThiagoLima vâng, tôi đồng ý với bạn! Tôi cũng bỏ phiếu trả lời hợp đồng dịch vụ.
Khoa TruongDinh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.