Как сделать join, если используется паттерн table data gateway

seine

Новичок
Как сделать join, если используется паттерн table data gateway

Привет, если есть две таблицы, и для каждой из них есть класс, реализующий паттерн table data gateway. Каким образом можно провести одновременную выборку из обоих таблиц?
Например, в первой таблице хранится список статей (articles), а во второй список категорий (cats). Каждая статья принадлежит какой-то категории, для этого в таблице статей есть колонка cat_id. Чтобы получить название этой категории надо обращаться к таблице cats.
Если нужно получить список статей с названиями категорий, которым они принадлежат, то можно было бы просто использовать join и всего делов. Но так как для каждой таблицы используется свой класс, и взаимодействие надо проводить через него, то прямое обращение к таблицам не катит. Как тогда можно извлечь данные сразу из двух таблиц? Как я понимаю это невозможно(
 

rotoZOOM

ACM maniac
Значит для твоих целей данный паттерн не подходит. Посмотри в сторону Data Mapper.
 

seine

Новичок
жаль... о, жизнь!.. ну да ладно... буду смотреть в сторону дата маппера...
 

Духовность™

Продвинутый новичок
rotoZOOM
Причем тут дата меппер?

seine
Если нужно получить список статей с названиями категорий, которым они принадлежат, то можно было бы просто использовать join и всего делов. Но так как для каждой таблицы используется свой класс, и взаимодействие надо проводить через него, то прямое обращение к таблицам не катит.
почему не катит? Зона ответственности класса ArticleGateway - это статьи. Вывод списка статей + join по категориям - вполне допустимый метод для этого класса.
 

Духовность™

Продвинутый новичок
Дата меппер не решает вопросы связанные с несколькими таблицами. Его смысл - отделять объекты от СУБД + создавать для объектов удобный интерфейс CRUD.

Потому что table data gateway имеет зону ответственности равную одной таблице.
в теории. на практике все иначе.
 

seine

Новичок
в теории. на практике все иначе.
Боюсь в моем случае, все как в теории. Я использую zf, а два класса реализующих table data gateway, это классы расширяющие Zend_Db_Table. Вот, что по этому поводу сказанно в документации:
Вы не можете указывать столбцы из присоединенных таблиц в качестве возвращаемых в строке/наборе строк. Попытка сделать это вызовет ошибку PHP. Это сделано для того, чтобы гарантировать целостность Zend_Db_Table, т.е. Zend_Db_Table_Row должен содержать столбцы только из той таблицы, которую представляет данный объект Zend_Db_Table.
И всё тут. join хоть и можно использовать, но только для поиска, а вернуть значения не получится.
И как тогда быть? Должно же быть какое-то типовое решение.
Может создать дата маппер, который при выборке будет обращаться к двум таблицам? Мне кажется, это отличный вариант)
Еще можно было бы отдельно извлекать список категорий, а потом уже в программно присваивать названия категорий статьям... но лучше все таки, чтоб этим занималась бд.
 

rotoZOOM

ACM maniac
Может создать дата маппер, который при выборке будет обращаться к двум таблицам? Мне кажется, это отличный вариант)
Мне тоже так кажется.

Дата меппер не решает вопросы связанные с несколькими таблицами. Его смысл - отделять объекты от СУБД + создавать для объектов удобный интерфейс CRUD.
Согласен только с первой частью второго предложения. :) Остальное отдано на откуп автору и его (автора) конкретной реализации.
 

seine

Новичок
Ага, оказывается можно включать дополнительные столбцы, с помощью join при использовании Zend_Db_Table, просто надо было внимательней мануал читать...
Нужно setIntegrityCheck(false) использовать.
Это я тем, кто вдруг столкентся с такой же проблемой в zf. А вообще, мануалы нужно читать внимательно (это я себе).
 
Сверху