Magento 2.1.1 Cómo cargar pedidos con ID de incremento utilizando el objeto OrderRepository


19

¿Cuál sería la mejor práctica más reciente para cargar Order usando el ID de incremento (en lugar del ID de Order) usando OrderRepository


2
No es un duplicado : la respuesta vinculada se trata de recuperar el pedido por ID de pedido, no por ID de incremento
Fabian Schmengler

ekk! ¿Hay alguna manera de deshacer la marca como duplicado? Tenía la intención de marcar la respuesta a continuación como la respuesta a la solución.
frostshoxx

1
Demasiado tarde, ahora que ya está cerrado. Pero nominé la pregunta para ser reabierta.
Fabian Schmengler

Respuestas:


32

Magento 2 utiliza contratos de servicio para recuperar y guardar objetos. En Magento, esta capa está formada por repositorios, que son administradores get()y save()métodos. Esto mantiene el código de usuario alejado de las llamadas de Modelo. No llame a métodos como modelo ( load()o save()o loadByIncrementId()) directamente, que están siendo obsoleta, ya que el código personalizado debe utilizar los contratos de servicio. Además, no use la API desde Magento como sugiere Khoa, no tiene sentido. La API es para conectar Magento con otros sistemas.

Inyecte OrderRepository y SearchCriteriaBuilder en su constructor:

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

Y en tu funció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);

Guía oficial para desarrolladores de PHP de Magento en magento.com

Código de Mulderea en github


Recibo un error como: No se puede usar el objeto de tipo Magento \ Sales \ Model \ ResourceModel \ Order \ Collection como matriz en $ order = $ orderList [0];
Ashish Raj

Eso es extraño, tengo una serie. ¿En qué versión estás? Pero con una colección sólo puede reemplazar $order = $orderList[0]con $order = $orderList->getFirstItem()para conseguir el primer punto (y única) de la colección.
Jacques

Estoy en la versión 2.1.3. y necesito cargar el objeto de pedido para cargar el objeto de pago. Lo he hecho, $order = $orderList->getFirstItem(); $payment = $order->getPayment();pero no recibí nada. $payment Por favor revise mi problema aquí magento.stackexchange.com/questions/158935/…
Ashish Raj

1
Tuve un error con la respuesta aceptada. Esto lo resolvió. Gracias por la buena solución
CompactCode

En Magento 2.3.x necesito obtener el pedido de esta manera:$order = $orderList['000000001'];
ph.dev

20

Que yo sepa, deberíamos 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;

}

Cargar objeto de pedido por ID de incremento:

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

[EDITAR] debería intentar con contratos de servicio. Prueba la respuesta de Jacco.


3
No utilice guiones bajos en sus nombres de variables. PHP ha tenido modificadores de acceso desde PHP 5, que ahora tiene 12 años. Debe usar prácticas modernas de programación, especialmente en las respuestas aquí.
Jacques

1
Este método no debe usarse incluso si "funciona". Uno: la diinyección es un objeto compartido a menos que se especifique que no lo es; cada vez que inserte OrderInterface usará exactamente el mismo objeto. Si realmente desea seguir esta ruta, use OrderInterfaceFactory y luego llame a create (). En segundo lugar, debe usar los contratos de servicio como en la respuesta de Jacco.
Ian

2
versión 2.2.2, uso \Magento\Sales\Api\OrderRepositoryInterfacey su get()método
LucScu

2
Los contratos de servicio deben tomarse en consideración.
Thiago Lima

1
@ThiagoLima sí, ¡estuve de acuerdo contigo! También voté la respuesta de los contratos de servicio.
Khoa TruongDinh
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.