PHP ООП объект. Как сделать выборку объектов?

Изучаю ООП (заказал книжку www.ozon.ru/context/detail/id/5648968 )

Есть обычная ситуация, допустим есть объект "комментарий" или лучше "статья/post" . Когда создаешь обект статьи ( new Article ), все прекрасно и понятно:
у него есть заголовок, есть автор, есть содержание, есть краткое содержание и т.д.
Чего понять не могу - это как сделать выборку статей на страницу? Это будет массив объектов или отдельный объект?

1) Если массив объектов, то зачем нам в массиве объектов "таскать" за собой полное содержание статей?

2) Есть поле/свойство author_id - это уже идентификатор другого объекта "пользователь". Вот как правильно должна происходить загрузка данных для объекта статьи (ведь она только сама про себя все знает), а надо подгрузить user_name, user_avatar из другой сущности.

Прошу, подскажите на конкретных примерах (так лучше пойму) или направьте на статью, где от этом написано.
  • Вопрос задан
  • 2525 просмотров
Пригласить эксперта
Ответы на вопрос 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Вам нужно нормальную ORM подсказать? Doctrine ORM

1) потому что вы не знаете нужно оно вам или нет. Это будет разруливаться позже, когда вы будете выводить статью. Возможно по вашей логике будет вывод полного содержания одной статьи и заголовки остальных. В любом случае это состояние объекта. По хорошему после "загрузки" объект должен быть в том состоянии в котором его "сохраняли". Как будто бы мы просто взяли из массива объект, добавленный ранее. Ну и да, за счет прокси классов та же Doctrine умеет загружать данные частично и все остальное по необходимости отдельными запросами.

2) обычно это просто поле author, которое хранит объект User, которые уже знает о том что внутри. Но отношения между объектами у вас всеравно есть. То есть ORM должна будет при обращении к полю user подгрузить всю сущность.

Мне кажется что вам еще рано думать о том как написать свою ORM.
Ответ написан
Комментировать
FanatPHP
@FanatPHP
Чебуратор тега РНР
На самом деле тут всё сложно.
В идеале, все должно быть так:

В массиве объектов "таскать" за собой полное содержание статей

Потому что объект и должен, по идее, содержать все свойства сущности "Статья".

Но все эти прекрасные теории разбиваются о суровую действительность. Главных камня преткновения два:
  1. Заведомая условность маппинга записи из таблицы БД на объект в программе.
  2. Не бесконечная мощность компьютера, которая и заставляет нас не таскать текст статьи там, где нужно вывест только заголовок.

Поэтому мы идем на всяческие ухищрения. В частности, мы договариваемя сами с собой, что наш объект "статья" - это отображение записи из таблицы. То есть, он жёстко привязан к структуре таблицы в БД. И дальше мы делаем себе ещё одно послабление - при инициализации объекта мы сожем указать, что нам нужен только заголовок. И тогда код создаст объект, то у него будет заполнено только одно свойство.

Соответственно, ответ на первый вопрос - массив объектов, но урезанных, с одним заполненным свойством!

Ответ на второй вопрос кроется в том же маппинге: Описывая свой объект как отображение таблицы в БД, мы можем описать и связи этой таблицы! И тогда наш объект сможет автоматически "подтягивать" связанные данные, если мы к ним обратимся.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы