Skip to content
intermediate Phase 36 · Service Contracts

SearchCriteria

FilterGroup, Filter, SortOrder, pagination, and building complex queries with SearchCriteria.

1h
0 problems
Topic Progress 0%

SearchCriteria Structure

SearchCriteria provides a structured way to build database queries.

SearchCriteria hierarchy:

SearchCriteria
├── FilterGroup[] (AND between groups)
│   └── Filter[] (OR within group)
│       ├── Field
│       ├── Condition Type
│       └── Value
├── SortOrder[]
├── PageSize
└── CurrentPage

Basic SearchCriteria:

use Magento\Framework\Api\SearchCriteriaBuilder;

$searchCriteria = $this->searchCriteriaBuilder->create();

// Get list
$results = $this->postRepository->getList($searchCriteria);

// Process results
foreach ($results->getItems() as $post) {
    echo $post->getTitle();
}

echo 'Total: ' . $results->getTotalCount();

SearchCriteriaBuilder:

$searchCriteria = $this->searchCriteriaBuilder
    ->addFilter('status', 1)
    ->create();

Filters and Conditions

Filters define the WHERE conditions for queries.

Single filter:

$filter = $this->filterBuilder
    ->setField('status')
    ->setConditionType('eq')
    ->setValue(1)
    ->create();

$searchCriteria = $this->searchCriteriaBuilder
    ->addFilter($filter)
    ->create();

Condition types:

'eq'        → = (equal)
'neq'       → != (not equal)
'like'      → LIKE
'finset'    → FIND_IN_SET
'in'        → IN
'nin'       → NOT IN
'gt'        → > (greater than)
'gteq'      → >= (greater than or equal)
'lt'        → < (less than)
'lteq'      → <= (less than or equal)
'null'      → IS NULL
'notnull'   → IS NOT NULL
'between'   → BETWEEN

Multiple filters (OR):

$searchCriteria = $this->searchCriteriaBuilder
    ->addFilter('status', 1)
    ->addFilter('featured', 1)
    ->create();
// WHERE status = 1 OR featured = 1

Multiple filters (AND):

$filterGroup1 = $this->filterGroupBuilder
    ->addFilter($this->filterBuilder->setField('status')->setValue(1)->create())
    ->create();

$filterGroup2 = $this->filterGroupBuilder
    ->addFilter($this->filterBuilder->setField('category_id')->setValue(5)->create())
    ->create();

$searchCriteria = $this->searchCriteriaBuilder
    ->setFilterGroups([$filterGroup1, $filterGroup2])
    ->create();
// WHERE (status = 1) AND (category_id = 5)

Between filter:

$filter = $this->filterBuilder
    ->setField('price')
    ->setConditionType('between')
    ->setValue([10, 100])
    ->create();

SortOrder and Pagination

Control result ordering and pagination.

Sort order:

$sortOrder = $this->sortOrderBuilder
    ->setField('created_at')
    ->setDirection('DESC')
    ->create();

$searchCriteria = $this->searchCriteriaBuilder
    ->addSortOrder($sortOrder)
    ->create();

Multiple sort orders:

$sortOrder1 = $this->sortOrderBuilder
    ->setField('position')
    ->setDirection('ASC')
    ->create();

$sortOrder2 = $this->sortOrderBuilder
    ->setField('created_at')
    ->setDirection('DESC')
    ->create();

$searchCriteria = $this->searchCriteriaBuilder
    ->addSortOrder($sortOrder1)
    ->addSortOrder($sortOrder2)
    ->create();
// ORDER BY position ASC, created_at DESC

Pagination:

$searchCriteria = $this->searchCriteriaBuilder
    ->setPageSize(20)     // Items per page
    ->setCurrentPage(2)   // Page number
    ->create();

Complete example:

$searchCriteria = $this->searchCriteriaBuilder
    ->addFilter('status', 1)
    ->addSortOrder($this->sortOrderBuilder
        ->setField('created_at')
        ->setDirection('DESC')
        ->create()
    )
    ->setPageSize(20)
    ->setCurrentPage(1)
    ->create();

$results = $this->postRepository->getList($searchCriteria);

SearchCriteria for REST API

SearchCriteria translates to REST API query parameters.

REST API filters:

# Equal
GET /rest/V1/posts?searchCriteria[filterGroups][0][filters][0][field]=status&searchCriteria[filterGroups][0][filters][0][value]=1

# IN
GET /rest/V1/posts?searchCriteria[filterGroups][0][filters][0][field]=status&searchCriteria[filterGroups][0][filters][0][value]=1&searchCriteria[filterGroups][0][filters][0][conditionType]=in

# LIKE
GET /rest/V1/posts?searchCriteria[filterGroups][0][filters][0][field]=title&searchCriteria[filterGroups][0][filters][0][value]=%keyword%&searchCriteria[filterGroups][0][filters][0][conditionType]=like

Sort order via API:

GET /rest/V1/posts?searchCriteria[sortOrders][0][field]=created_at&searchCriteria[sortOrders][0][direction]=DESC

Pagination via API:

GET /rest/V1/posts?searchCriteria[pageSize]=20&searchCriteria[currentPage]=1

PHP to API mapping:

addFilter('status', 1)
→ filterGroups[0][filters][0][field]=status
→ filterGroups[0][filters][0][value]=1

addSortOrder('created_at', 'DESC')
→ sortOrders[0][field]=created_at
→ sortOrders[0][direction]=DESC

setPageSize(20)->setCurrentPage(1)
→ pageSize=20
→ currentPage=1

SearchCriteria parser:

// Parse from API request
$searchCriteria = $this->searchCriteriaBuilder->create();

// From query params
if ($this->request->getParam('searchCriteria')) {
    $searchCriteria = $this->filterMapper->map($this->request->getParam('searchCriteria'));
}

Quiz

1. What is the relationship between FilterGroup and Filter?

Question 1 options

2. How do you create a LIKE condition?

Question 2 options

3. What API parameter sets page size?

Question 3 options

4. How do you sort by multiple fields?

Question 4 options

Flashcards

Question

What is FilterGroup?

Answer

Contains Filters that are ORed; groups are ANDed

Question

How do you add a filter?

Answer

$builder->addFilter('field', 'value')

Question

How do you set pagination?

Answer

$builder->setPageSize(20)->setCurrentPage(1)

Question

What API param controls sorting?

Answer

searchCriteria[sortOrders][0][field]=name

Question

What condition type is for ranges?

Answer

between (with array value [min, max])

Revision Notes

Key Takeaways

  • 1. SearchCriteria builds queries with FilterGroups, SortOrders, pagination
  • 2. Filters within group: OR; Groups: AND
  • 3. Condition types: eq, neq, like, in, nin, gt, lt, between, null
  • 4. REST API maps SearchCriteria to query parameters
  • 5. SortOrder and pagination set before query execution
  • 6. SearchCriteriaBuilder provides fluent API for building queries

Interview Tips

  • Explain FilterGroup vs Filter relationship
  • Describe how to build complex queries
  • Know REST API mapping for SearchCriteria
  • Discuss pagination best practices

Cheat Sheet

SearchCriteria Cheat Sheet

Structure:

SearchCriteria
├── FilterGroups (AND)
│   └── Filters (OR)
├── SortOrders
├── PageSize
└── CurrentPage

Builder:

$criteria = $this->searchCriteriaBuilder
    ->addFilter('status', 1)
    ->addSortOrder($sortOrder)
    ->setPageSize(20)
    ->setCurrentPage(1)
    ->create();

Conditions:

  • eq, neq, like, in, nin
  • gt, gteq, lt, lteq
  • between, null, notnull

REST API:
searchCriteria[filterGroups][0][filters][0][field]=status
searchCriteria[filterGroups][0][filters][0][value]=1