Skip to content
intermediate Phase 50 · Order Operations

Order Repositories

OrderRepositoryInterface, searching orders, filtering by status, date, and customer

45m
0 problems
Topic Progress 0%

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?

Question 1 options

2. What does getTotalCount() return?

Question 2 options

3. How do you sort search results?

Question 3 options

Flashcards

Question

OrderRepositoryInterface methods?

Answer

get(), getList(), save(), delete()

Question

How to filter orders?

Answer

SearchCriteriaBuilder::addFilter(field, value, condition)

Question

Pagination methods?

Answer

setPageSize() and setCurrentPage()

Question

Sorting method?

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