Атрибут OrderBy
Атрибут OrderBy вешается на свойство
сущности, которое хранит коллекцию связанных
объектов. Он задаёт порядок, в котором Doctrine
будет возвращать связанные записи при выборке.
Первым параметром передаётся массив, где ключ -
имя поля связанной сущности, а значение -
направление сортировки: 'ASC' или
'DESC'.
Синтаксис
#[OrderBy(['field' => 'ASC'])]
Пример
Давайте создадим сущность Article со связью
OneToMany на сущность Comment и
отсортируем комментарии по полю createdAt
по убыванию:
<?php
namespace AppEntity;
use AppRepositoryArticleRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMColumn(length: 255)]
private ?string $title = null;
#[ORMOneToMany(mappedBy: 'article', targetEntity: Comment::class)]
#[ORMOrderBy(['createdAt' => 'DESC'])]
private Collection $comments;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): static
{
$this->title = $title;
return $this;
}
public function getComments(): Collection
{
return $this->comments;
}
}
?>
Теперь при обращении к коллекции comments
Doctrine автоматически отсортирует комментарии
по дате создания от новых к старым.
Пример
Давайте зададим сортировку сразу по двум полям:
сначала по createdAt по убыванию, затем по
text по возрастанию:
<?php
namespace AppEntity;
use DoctrineORMMapping as ORM;
#[ORMEntity]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn]
private ?int $id = null;
#[ORMOneToMany(mappedBy: 'article', targetEntity: Comment::class)]
#[ORMOrderBy(['createdAt' => 'DESC', 'text' => 'ASC'])]
private Collection $comments;
public function getComments(): Collection
{
return $this->comments;
}
}
?>
Порядок ключей в массиве определяет приоритет сортировки: первое поле - главное, второе - дополнительное.
Пример
Давайте выведем отсортированные комментарии в контроллере:
<?php
namespace AppController;
use AppEntityArticle;
use AppRepositoryArticleRepository;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
class ArticleController extends AbstractController
{
public function show(ArticleRepository $articleRepository): Response
{
$article = $articleRepository->find(1);
$res = [];
foreach ($article->getComments() as $comment) {
$res[] = $comment->getText();
}
return new Response(implode(', ', $res));
}
}
?>
Результат выполнения кода:
"article 3, article 2, article 1"