Feature: #32051 - Extbase query expression builder for orderings
See forge#32051
Description
Extbase queries now support SQL expressions in
ORDER BY
clauses through a new fluent API. This enables results to be sorted using
functions such as
CONCAT,
TRIM, and
COALESCE.
The following methods have been added to the
\TYPO3\:
order- Sets a single ordering and replaces any existing orderingsBy () add- Adds an ordering to the existing orderingsOrder By () concat- Creates a() CONCATexpressiontrim- Creates a() TRIMexpressioncoalesce- Creates a() COALESCEexpression
Examples
Order by concatenated fields:
$query = $this->myRepository->createQuery();
$query->orderBy(
$query->concat('firstName', 'lastName'),
QueryInterface::ORDER_ASCENDING
);
Order by a trimmed field:
$query->orderBy(
$query->trim('title'),
QueryInterface::ORDER_DESCENDING
);
Order by the first non-null value (a fallback pattern):
$query->orderBy(
$query->coalesce('nickname', 'firstName'),
QueryInterface::ORDER_ASCENDING
);
Chain multiple orderings:
$query
->orderBy($query->concat('firstName', 'lastName'))
->addOrderBy('createdAt', QueryInterface::ORDER_DESCENDING);
Nest expressions:
$query->orderBy(
$query->concat(
$query->trim('firstName'),
$query->trim('lastName')
)
);
Backwards compatibility
The existing
set method with its array syntax will continue to work:
$query->setOrderings([
'title' => QueryInterface::ORDER_ASCENDING,
'date' => QueryInterface::ORDER_DESCENDING,
]);
Impact
Developers can now use SQL functions in Extbase query orderings without resorting to raw SQL statements. This enables more flexible sorting logic while maintaining the abstraction and security benefits of the Extbase persistence layer.