Magento 2.1.1 Como carregar Order com ID de incremento usando o objeto OrderRepository

19

Qual seria a melhor prática mais recente para carregar o pedido usando o ID de incremento (em vez do ID do pedido) usando o OrderRepository

frostshoxx
fonte
2
Não é um duplicado - a resposta vinculada é sobre como recuperar a ordem por ID de ordem, não por ID de incremento
Fabian Schmengler
ekk! Existe uma maneira de desfazer a marca como duplicada? Eu pretendia marcar a resposta abaixo como a resposta para a solução.
frostshoxx
1
Tarde demais, agora que já está fechado. Mas eu indiquei a questão a ser reaberta.
Fabian Schmengler

Respostas:

32

O Magento 2 usa contratos de serviço para recuperar e salvar objetos. No Magento, essa camada é formada por Repositórios, que são gerentes get()e save()métodos. Isso mantém o código do usuário longe das chamadas de modelo. Não chame métodos de modelo (como load()ou save()ou loadByIncrementId()) diretamente, pois eles estão sendo preteridos, pois o código personalizado deve usar os Contratos de Serviço. Além disso, não use a API do Magento, como sugere o Khoa, isso não faz sentido. A API é para conectar o Magento a outros sistemas.

Injete OrderRepository e SearchCriteriaBuilder em seu construtor:

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

E na sua função:

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

Guia oficial do desenvolvedor do Magento PHP em magento.com

Code de Mulderea no github

Jacques
fonte
Estou recebendo erro como: Não é possível usar o objeto do tipo Magento \ Sales \ Model \ ResourceModel \ Order \ Collection como matriz em $ order = $ orderList [0];
Ashish Raj
Estranho, eu tenho uma matriz. Em qual versão você está? Mas com uma coleção, você pode simplesmente substituir $order = $orderList[0]por $order = $orderList->getFirstItem()para obter o primeiro (e único) item da coleção.
Jacques
Estou na versão 2.1.3. e eu preciso objeto ordem de carregamento para o objeto de pagamento carga .. eu fiz $order = $orderList->getFirstItem(); $payment = $order->getPayment();Mas conseguir nada em $payment favor verificar o meu problema aqui magento.stackexchange.com/questions/158935/...
Ashish Raj
1
Eu tive um erro com a resposta aceita. Isso resolveu. Obrigado pela boa solução
CompactCode
No Magento 2.3.x, preciso receber o pedido desta maneira:$order = $orderList['000000001'];
ph.dev 19/09/09
20

Tanto quanto eu sei, devemos usar \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;

}

Carregar objeto de pedido por ID de incremento:

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

[EDIT] deve tentar contratos de serviço. Tente a resposta de Jacco.

Khoa TruongDinh
fonte
3
Por favor, não use sublinhados em seus nomes de variáveis. O PHP possui modificadores de acesso desde o PHP 5, que agora tem 12 anos. Você deve usar práticas de programação modernas, especialmente nas respostas aqui.
Jacques
1
Este método não deve ser usado mesmo que "funcione". Um: a injeção de di é um objeto compartilhado, a menos que seja especificado para não ser; sempre que você inserir OrderInterface, estará usando exatamente o mesmo objeto. Se você realmente deseja seguir esse caminho, use OrderInterfaceFactory e, em seguida, chame create (). Segundo, você deve usar os contratos de serviço como na resposta da Jacco.
31717 Ian
2
versão 2.2.2, uso \Magento\Sales\Api\OrderRepositoryInterfacee seu get()método
LucScu 6/18
2
contratos de serviço devem ser levados em consideração.
Thiago Lima
1
@ThiagoLima sim, eu concordei com você! Também votei na resposta dos contratos de serviço.
precisa saber é o seguinte