эффективный способ отображения подмножества коллекции Doctrine в ветке - PullRequest
0 голосов
/ 27 октября 2018

У меня есть сущность Symfony, которая имеет отображение OneToMany с предложением OrderBy, например:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\News", mappedBy="category", orphanRemoval=true)
 * @ORM\OrderBy({"id" = "DESC"})
 */
private $news;

Предполагая, что я хотел бы отображать только n записей в Twig, у меня будет возможность либо зацикливаться на нем и игнорировать каждую вещь после loop.index n, либо, скорее, использовать slice . Однако у этих параметров есть и недостаток: если будет много записей новостей, все они будут загружены, что не очень эффективно.

Другим вариантом будет использование Критериев в контроллере или объекте для ограничения количества загружаемых объектов. Если я правильно понял здесь , он должен изменить запрос доктрины напрямую и, таким образом, не повлиять на производительность. Это лучший метод или лучше иметь собственный контроллер запросов в контроллере или функцию в хранилище?

1 Ответ

0 голосов
/ 28 октября 2018

На самом деле вы можете установить $news отношение как EXTRA_LAZY и использовать функцию $news->slice() без запуска полной нагрузки, как указано в официальной документации :

Если вы отметитеПри связывании с дополнительными отложениями следующие методы для коллекций могут вызываться без запуска полной загрузки коллекции:

Collection#contains($entity)
Collection#containsKey($key) (available with Doctrine 2.5)
Collection#count()
Collection#get($key) (available with Doctrine 2.4)
Collection#slice($offset, $length = null)

Поэтому ваше объявление должно выглядеть следующим образом:

/**
 * @ORM\OneToMany(targetEntity="App\Entity\News", mappedBy="category", orphanRemoval=true, fetch="EXTRA_LAZY")
 * @ORM\OrderBy({"id" = "DESC"})
 */
private $news;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...