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

frostshoxx
fuente
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

Jacques
fuente
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.

Khoa TruongDinh
fuente
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