Ordering To-Many Associations¶
There are use-cases when you’ll want to sort collections when they are
retrieved from the database. In userland you do this as long as you
haven’t initially saved an entity with its associations into the
database. To retrieve a sorted collection from the database you can
use the #[OrderBy]
attribute with a collection that specifies
a DQL snippet that is appended to all queries with this
collection.
Additional to any #[OneToMany]
or #[ManyToMany]
attribute you
can specify the #[OrderBy]
in the following way:
The DQL Snippet in OrderBy is only allowed to consist of
unqualified, unquoted field names and of an optional ASC/DESC
positional statement. Multiple Fields are separated by a comma (,).
The referenced field names have to exist on the targetEntity
class of the #[ManyToMany]
or #[OneToMany]
attribute.
The semantics of this feature can be described as follows:
@OrderBy
acts as an implicit ORDER BY clause for the given fields, that is appended to all the explicitly given ORDER BY items.@OrderBy は、指定されたフィールドの暗黙の ORDER BY 句として機能し、明示的に指定されたすべての ORDER BY 項目に追加されます。All collections of the ordered type are always retrieved in an ordered fashion.
順序付けられた型のすべてのコレクションは、常に順序付けられた方法で取得されます。To keep the database impact low, these implicit ORDER BY items are only added to a DQL Query if the collection is fetch joined in the DQL query.
データベースへの影響を低く抑えるために、これらの暗黙的な ORDER BY 項目は、コレクションが DQL クエリでフェッチ結合されている場合にのみ DQL クエリに追加されます。
Given our previously defined example, the following would not add ORDER BY, since g is not fetch joined:
SELECT u FROM User u JOIN u.groups g WHERE SIZE(g) > 10
However the following:
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10
…would internally be rewritten to:
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10 ORDER BY g.name ASC
You can reverse the order with an explicit DQL ORDER BY:
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10 ORDER BY g.name DESC
…is internally rewritten to:
SELECT u, g FROM User u JOIN u.groups g WHERE u.id = 10 ORDER BY g.name DESC, g.name ASC