There is no need to use order factory
to fetch a particular Order item.
That case, you can use order item repository class Magento\Sales\Api\OrderItemRepositoryInterface
That has get()
and getList()
method using these you can fetch a particular item data.
If you have an order item id then you can use get()
and that is the best method in that case.
But if have an order id then you can use getList()` and using Search Criteria , you can an order items order.
You can follow below article for how you can filter a Magento 2 Object Repository
Filtering a Magento 2 Object Repository
Magento2: How to add multiple AND and OR conditions to filter/filterGroups?
Same Code:
<?php
namespace StackExchange\Magento\Model;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Sales\Api\OrderItemRepositoryInterface;
class OrderItem {
/**
* @var \Magento\Framework\Api\SearchCriteriaBuilder
*/
private $searchCriteriaBuilder;
/**
* @var \Magento\Framework\Api\Search\FilterGroupBuilder
*/
private $filterGroupBuilder;
/**
* @var \Magento\Framework\Api\FilterBuilder
*/
private $filterBuilder;
/**
* @var \Magento\Sales\Api\OrderItemRepositoryInterface
*/
private $orderItemRepository;
public function __construct(
OrderItemRepositoryInterface $orderItemRepository,
\Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
\Magento\Framework\Api\FilterBuilder $filterBuilder,
\Magento\Framework\Api\Search\FilterGroupBuilder $filterGroupBuilder
) {
$this->orderItemRepository = $orderItemRepository;
$this->filterBuilder = $filterBuilder;
$this->filterGroupBuilder = $filterGroupBuilder;
$this->searchCriteriaBuilder = $searchCriteriaBuilder;
}
public function getOrderItemByOrderItemId()
{
$id = 99;
try{
$orderItem = $this->orderItemRepository->get($id);
return $orderItem;
} catch (NoSuchEntityException $ex) {
return false;
}
return false;
}
public function getOrderItemByOrderId()
{
$orderId = 15;
$productId = 105;
$searchCriteria = $this->searchCriteriaBuilder->addFilter('order_id', $orderId)
->addFilter('product_id', $productId);
$orderItems = $this->orderItemRepository->getList($searchCriteria);
if($orderItems->getTotalCount() > 0)
{
$orderItemsData = $orderItems->getItems();
// Running foreach as item collection in array
foreach($orderItemsData as $orderItem)
{
//
$orderItem;
}
}
}
}