Задать вопрос

Что делать, если нужно получить часть данных сущности?

Всем привет. Представим есть код:
interface Post
{
      public function getName(): string;

      public function getDescription(): string;

     public function getText(): string;
}

interface PostRepository
{
       public function findall()
      {

      }
}


Как бы все работает, все хорошо. Но к примеру, нам в сайдбаре нужно вывести список последних постов за неделю. Из данных нам нужно только название поста (getName) и короткое описание (getDescription). Если мы будем заполнять эти данные из репозитория, то сущность у нас будет не полной (getText == null), а если мы будем получать все данные, то сущность будет избыточной. (Я сильно упростил пример, у Post может быть тонна других зависимостей)

Как быть в таких случаях?
  1. Делать отдельный репозиторий и отдельную сущность
  2. Использовать stdClass[] или array[]


На проекте нет Doctrine, поэтому Proxy объекты для связей отсутствуют. Т.е. findAll / findOne из репозитория всегда вернет полный объект, даже если нужна часть этого объекта. Как вы решаете эту проблему у себя?
  • Вопрос задан
  • 237 просмотров
Подписаться 4 Простой 1 комментарий
Ответ пользователя Антон Шаманов К ответам на вопрос (4)
SilenceOfWinter
@SilenceOfWinter Куратор тега PHP
та еще зажигалка...
1. "lazy loading" - в конструктор передаем обязательные к заполнению параметры, остальные данные подгружаем из базы по мере вызова методов т.е.
public function getText(): string
{
    if ($this->text === null) {
        $this->loadData();
    }
    return $this->text;
}

2. Использовать класс хэлпер, например, нужны breadcrumbs, создаем в хэлпере метод getBreadcrumbs в который передается массив Post объектов, метод извлекает данные из объектов и получает недостающие данные одним запросом сразу для всех постов.
Ответ написан