Order Repository Interface
Repository Methods
// Magento\Sales\Api\OrderRepositoryInterface
namespace Magento\Sales\Api;
interface OrderRepositoryInterface
{
/**
* Get order by ID
*/
public function get(int $orderId): \Magento\Sales\Api\Data\OrderInterface;
/**
* Get list of orders matching criteria
*/
public function getList(
\Magento\Framework\Api\SearchCriteriaInterface $searchCriteria
): \Magento\Framework\Api\SearchResultsInterface;
/**
* Save order
*/
public function save(
\Magento\Sales\Api\Data\OrderInterface $order
): \Magento\Sales\Api\Data\OrderInterface;
/**
* Delete order
*/
public function delete(
\Magento\Sales\Api\Data\OrderInterface $order
): bool;
}
Basic Usage
namespace Vendor\Order\Service;
class OrderManager
{
public function __construct(
private \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
) {}
public function getOrder(int $orderId): \Magento\Sales\Api\Data\OrderInterface
{
return $this->orderRepository->get($orderId);
}
public function getOrderByIncrementId(string $incrementId): \Magento\Sales\Api\Data\OrderInterface
{
$searchCriteria = $this->searchCriteriaBuilder
->addFilter('increment_id', $incrementId)
->create();
$result = $this->orderRepository->getList($searchCriteria);
return $result->getFirstItem();
}
}
Search Criteria Builder
Building Search Criteria
namespace Vendor\Order\Search;
class OrderSearch
{
public function __construct(
private \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
private \Magento\Framework\Api\FilterBuilder $filterBuilder,
private \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
) {}
public function searchOrders(array $filters): \Magento\Framework\Api\SearchResultsInterface
{
$searchCriteria = $this->searchCriteriaBuilder
->addFilters($filters)
->setPageSize(20)
->setCurrentPage(1)
->create();
return $this->orderRepository->getList($searchCriteria);
}
}
Filter Examples
// Filter by status
$filter = $this->filterBuilder
->setField('status')
->setConditionType('eq')
->setValue('processing')
->create();
// Filter by date range
$filter = $this->filterBuilder
->setField('created_at')
->setConditionType('gteq')
->setValue('2024-01-01')
->create();
// Filter by multiple values
$filter = $this->filterBuilder
->setField('status')
->setConditionType('in')
->setValue(['processing', 'complete'])
->create();
// Filter by customer
$filter = $this->filterBuilder
->setField('customer_id')
->setConditionType('eq')
->setValue(123)
->create();
Filtering Orders
Common Filters
namespace Vendor\Order\Search;
class OrderFilter
{
public function __construct(
private \Magento\Framework\Api\SearchCriteriaBuilder $searchCriteriaBuilder,
private \Magento\Sales\Api\OrderRepositoryInterface $orderRepository
) {}
/** Filter by status */
public function getByStatus(string $status): array
{
$criteria = $this->searchCriteriaBuilder
->addFilter('status', $status)
->create();
return $this->orderRepository->getList($criteria)->getItems();
}
/** Filter by date range */
public function getByDateRange(string $from, string $to): array
{
$criteria = $this->searchCriteriaBuilder
->addFilter('created_at', $from, 'gteq')
->addFilter('created_at', $to, 'lteq')
->create();
return $this->orderRepository->getList($criteria)->getItems();
}
/** Filter by customer */
public function getByCustomer(int $customerId): array
{
$criteria = $this->searchCriteriaBuilder
->addFilter('customer_id', $customerId)
->create();
return $this->orderRepository->getList($criteria)->getItems();
}
/** Combined filters */
public function search(int $customerId, string $status, string $from, string $to): array
{
$criteria = $this->searchCriteriaBuilder
->addFilter('customer_id', $customerId)
->addFilter('status', $status)
->addFilter('created_at', $from, 'gteq')
->addFilter('created_at', $to, 'lteq')
->setSortOrder(
$this->searchCriteriaBuilder
->setSortOrder('created_at')
->setDirection('DESC')
->create()
)
->setPageSize(50)
->create();
return $this->orderRepository->getList($criteria)->getItems();
}
}
Advanced Search
Search Results
// Get search results with total count
$result = $this->orderRepository->getList($searchCriteria);
$orders = $result->getItems(); // Array of orders
$total = $result->getTotalCount(); // Total matching orders
$pageSize = $result->getSearchCriteria()->getPageSize();
$currentPage = $result->getSearchCriteria()->getCurrentPage();
Sorting Results
// Sort by field
$sortOrder = $this->searchCriteriaBuilder->setSortOrder('created_at');
$sortOrder->setDirection('DESC');
$criteria = $this->searchCriteriaBuilder
->setSortOrder($sortOrder->create())
->create();
// Multiple sort orders
$sortOrders = [
$this->searchCriteriaBuilder
->setSortOrder('status')
->setDirection('ASC')
->create(),
$this->searchCriteriaBuilder
->setSortOrder('created_at')
->setDirection('DESC')
->create(),
];
$criteria = $this->searchCriteriaBuilder
->setSortOrders($sortOrders)
->create();
Pagination
// Paginate results
$criteria = $this->searchCriteriaBuilder
->setPageSize(20)
->setCurrentPage(1)
->create();
$result = $this->orderRepository->getList($criteria);
// Check if more pages exist
$totalPages = ceil($result->getTotalCount() / 20);
Quiz
1. How do you filter orders by status?
2. What does getTotalCount() return?
3. How do you sort search results?
Flashcards
Question
OrderRepositoryInterface methods?
Click to reveal answer
Answer
get(), getList(), save(), delete()
Question
How to filter orders?
Click to reveal answer
Answer
SearchCriteriaBuilder::addFilter(field, value, condition)
Question
Pagination methods?
Click to reveal answer
Answer
setPageSize() and setCurrentPage()
Question
Sorting method?
Click to reveal answer
Answer
setSortOrder(field, direction)
Revision Notes
Key Takeaways
- 1. OrderRepositoryInterface provides get(), getList(), save(), delete()
- 2. SearchCriteriaBuilder constructs filters, sorting, and pagination
- 3. Filters support eq, in, gteq, lteq, and other conditions
- 4. Results include items, total count, and pagination info
- 5. Multiple filters can be combined for complex searches
Interview Tips
- • Explain the SearchCriteria pattern and its benefits
- • Describe how to paginate large result sets
- • Discuss combining multiple filters for complex queries
Cheat Sheet
Order Repository:
get($id) → single order
getList($criteria) → search results
save($order) → persist changes
delete($order) → remove
Search Criteria:
addFilter(field, value, condition)
setPageSize(n)
setCurrentPage(n)
setSortOrder(field, direction)
Result:
getItems() → array of orders
getTotalCount() → total matching