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


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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.