Magento 2.1.1 OrderRepository 객체를 사용하여 Increment ID로 주문을로드하는 방법


19

OrderRepository를 사용하여 주문 ID 대신 증분 ID를 사용하여 주문을로드하는 가장 좋은 방법 은 무엇입니까 ?


2
중복이 아님 -링크 된 답변은 증분 ID가 아닌 주문 ID별로 주문을 검색하는 것입니다.
Fabian Schmengler

kk! 마크를 중복으로 실행 취소하는 방법이 있습니까? 아래 답변을 솔루션에 대한 답변으로 표시하려고했습니다.
frostshoxx

1
이미 닫혀서 너무 늦었습니다. 그러나 나는 다시 열어야 할 질문을 지명했다.
Fabian Schmengler

답변:


32

Magento 2는 서비스 계약을 사용하여 개체를 검색하고 저장합니다. 젠토에서는이 층을 가진 관리자이다 리포지터리에 의해 형성 get()save()방법에 관한 것이다. 이것은 사용자 코드를 모델 호출에서 멀리 유지합니다. 같은 모델 방법 (호출하지 마십시오 load()save()또는loadByIncrementId()사용자 정의 코드가 서비스 계약을 사용해야하므로 )를 직접 . 또한 Khoa가 제안한 것처럼 Magento 내에서 API를 사용하지 마십시오. API는 Magento를 다른 시스템과 연결하기위한 것입니다.

생성자에 OrderRepository 및 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 코드


다음과 같은 오류가 발생합니다. $ agent = $ orderList [0]에서 Magento \ Sales \ Model \ ResourceModel \ Order \ Collection 유형의 배열을 배열로 사용할 수 없습니다.
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;

}

증분 ID별로 주문 오브젝트로드 :

$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\OrderRepositoryInterfaceget()방법
LucScu

2
서비스 계약을 고려해야합니다.
Thiago Lima

1
@ThiagoLima 예, 당신과 동의했습니다! 또한 서비스 계약 답변에 투표했습니다.
Khoa TruongDinh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.