dim4ik
@dim4ik

Не могу разобраться с active record. Как получить данные из двух таблиц?

Есть таблица пользователей, комментариев/статей ....
На странице необходимо вывести список комментариев к статье/список статей .

В случае с active record ( habrahabr.ru/post/198450 ) получается, что объект содержит только те данные, которые есть в таблице бд/xm/ini/ (т.е. копирует ее структуру).
Для объекта user все прекрасно и понятно, но как быть с объектом "комментарий" или "статья", в которых указан только user_id, а имя пользователя, аватарка и другие параметры хранятся в таблице users?

Как в подходе active record реализовать вывод списка комментариев/статей с именами и аватарками пользователей?
  • Вопрос задан
  • 2298 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
В базе данных у вас заданы связи между таблицами (внешние ключи или foreign keys). Их может и не быть но предположим что они есть. Тогда логично предположить, раз наши объекты в рамках ActiveRecord имеют ту же структуру, у них так же есть ссылки на другие объекты. Обычно их описывают вручную или хотя бы говорят какое поле на какое ссылается.

Например в случае статей у объекта Article есть поле user (или author, как кто назовет). При обращении к этому полю AR вызывает запрос в базу данных с where id = user_id, получае результат и возвращает объект User связанный с нашим Article-ом.

Так же данные уже могли быть получены, скажем если выборка статей была сделана с JOIN-ами. Тогда при обращении к полю users оно просто возьмет данные и вернет объект.

У User же будет пропертя articles и при обращении к ней нам вернется массив всех статей. По той же схеме, с отдельным запросом если данных еще нет.

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

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

Похожие вопросы