Вопрос по "объекту, его DataMapperу и связи с другими объектами"

Крот

Новичок
Вопрос по "объекту, его DataMapperу и связи с другими объектами"

Здравствуйте!

Возник небольшой вопрос по использованию связки "объект + его DataMapper".

Есть 3 таблицы...

Таблица: books
book_id
isdn
title

Таблица: authors
author_id
firstname
lastname

Таблица: authors2books
author_id
book_id

У таблиц books и authors есть соответствующие объекты, у которых определены методы set, get

Для каждого из этих объектов есть Mapper. В каждом из мапперов есть набор стандартный ф-ий а-ля find, load, add, save и т.д.

Если мне нужно получить список книг, то я использую $BooksMapper->find(....). В это случае на выходе я получаю массив объектов, где каждый объект это книга; и это очень удобно!

Теперь мне нужно получить не просто список книг, а список книг + список авторов (одним запросом). Я дополняю маппер ф-ией FindBooksWithInformationAboutAuthor(), которая лефт джойнит таблицы и отдаёт результат. Вот теперь самое интересное - как мне на выходе этой ф-ии получить не просто массив, а массив объектов. Ведь такие параметры, как firstname, lastname, author_id уже не входят в набор параметров класса Books.

Как быть? Забить и возвращать значения просто в виде массива? Но тогда как-то не очень красиво получается. Где-то я буду при отображении использовать $book->getTitle(), а где-то $book['title']. Так и самому запутаться недолго. Подскажите пожалуйста элегантное решение (без ORM - это для меня слишком сложно еще).

P.S. - пробовал смотреть в сторону ActiveRecord, но там этот вопрос по-прежнему остаётся открытым.
 

zerkms

TDD infected
Команда форума
Автор - "свойство" книги.
$book->getAuthor()->getName();

При получении результата просто заполняй не только объект $book, но и $book->author
 

Крот

Новичок
Хм, почему-то я не подумал о том, что в set, get можно пихать объект. Спасибо! Красиво!

Сейчас подумал еще, а как BookMapper создавать объекты типа Author, т.е. откуда BookMapper будет знать о существовании класса Author?
 

zerkms

TDD infected
Команда форума
Сейчас подумал еще, а как BookMapper создавать объекты типа Author, т.е. откуда BookMapper будет знать о существовании класса Author?
а вот это знание нужно как-то добавить. как ты это будешь делать - не важно, как тебе удобно.

ps: вот и становится всё больше и больше похожим на орм всё :)
 

Beavis

Banned
ты всё равно такими темпами получишь мини-ORM, но довольно костыльную, так что я на своём опыте убедился что лучше с самого начала начать использовать нормальную ORM, хотя бы для того чтоб разобраться как решаются подобные проблемы, а потом уже можно и что-то своё написать, не такое тяжелое
 

Крот

Новичок
Честно говоря я не хочу сейчас изучать ORM из-за того, что он мне не даётся. Я курил мануалы по пропелу и почти ничего не понял. :(
Стыдно, но факт. Возможно еще не дошел до этого...

Нашел вот пару статей по ORM (доступным языком написанных)...

http://brotkin.ru/2009/02/01/orm/
http://brotkin.ru/2009/04/18/orm-svyazi/

-~{}~ 06.10.09 12:05:

Кстати очень дельные и простые статьи, многое прояснилось...
 

Духовность™

Продвинутый новичок
Крот
Честно говоря я не хочу сейчас изучать ORM из-за того, что он мне не даётся.
Что значит не хочу "изучать"? ORM - это не готовое решение, что бы его "изучать", это подход в программировании. И ты уже вляпался в ORM.

У тебя сейчас три выхода:

1. Писать свою ORM - ты это уже начал делать, но сложность очень большая, как ты понимаешь.
2. Использовать готовое решение.
3. Забить и "возвращать значения просто в виде массива".

Есть ещё один вариант: не пытаться писать на ООП процедуры ввода-вывода данных, ибо это всё равно приводит к ORM.

откуда BookMapper будет знать о существовании класса Author?
Я думаю, что BookMapper ничего не должен знать о классах. О существовании класса Author должен знать класс Article. В нем должна быть зашита информация, что один из атрибутов класса Article - объект Author. И твой ORM должен уметь всё это дело сохранять, вытаскивать.... короче геморрой на все 500%.
 

zerkms

TDD infected
Команда форума
triumvirat
Я думаю, что BookMapper ничего не должен знать о классах.
как раз маппер и должен знать, потому как маппер и занимается отображением данных из пхп в базу и обратно.
 
Сверху