2009-09-16 1 views
1

Это моя структура таблицы.Чтобы получить полную строку с таблицами объединений в Zend_Db_Table

http://img6.imageshack.us/img6/8730/articlek.jpg

Я хочу, чтобы получить объект статьи строки из идентификатора с раздела и категории имен вместо SECTION_ID и CATEGORY_ID, а также имена пользователей вместо author_id и MODIFIED_BY.

Пожалуйста, помогите мне.

ответ

1

Это вне сферы действия Zend_Db_Table. Zend_Db_Table может упростить получение этих других строк (see here), но он не будет делать это автоматически. Вы можете проверить Zend Framework Quick Start, он говорит об использовании шаблона DataMapper, и это может быть то, что вы хотите изучить.

Один вариант, который вам нужно расширить Zend_Db_Table_Row, а в методе init() запросить другие таблицы для необходимой информации. Вы можете задать класс строки для использования в классе Zend_Db_Table с помощью переопределения переменной rowClass:

protected $_rowClass = 'FooRow'; 

Из комментариев:

require_once(dirname(realpath(__FILE__) . '/path/relative/to/articles/ArticleRow.php'); 
+1

Я уже установил dependTables и referenceMaps для таблиц. Но я не знаю, как получить соответствующий результат, который я хочу получить из Zend_Db_Table (таблица статей). Спасибо за помощь – neobeacon

+0

Это код sql. выберите sec.title в разделе '', cat.title как 'категория', auth.Name, как 'автор', modi.Name как 'модификатор', искусства. * из статьи искусства левое внешнее соединение раздел сек на sec.id = art.section_id левых внешнее соединение категорию кота на cat.id = art.category_id левых внешнее соединение Идент.польза на auth.id = art.author_id левых внешнее соединение пользователя модусов на модусах .id = art.modified_by где art.id = '1' – neobeacon

+1

Я обновил свой ответ потенциальным решением. Я действительно чувствую, что, если вам нужна такая функциональность, Zend_Db_Table - неправильное направление. – smack0007

9

Вы должны использовать setIntegrityCheck() функциональность Zend_Db_Table «s:

Что-то как это должно работать:

$articleTable = new Article(); 
$select = $articleTable->select(); 
$select->setIntegrityCheck(false); 
$select->from('article', 'article.*'); 
$select->joinLeft('user', 'article.author_id = user.id', array('author_name'=>'author')); 
$select->where('article.id = 123'); 
$articleRecord = $articleTable->fetchRow($select); 

Вы можете проверить SQL сгенерированного с помощью:

Zend_Debug::dump($select->__toString()); 

Обратите внимание, что возвращаемый Zend_Db_Table_Row объект только для чтения.

+0

Большое спасибо – neobeacon

+0

Не должно быть: $ select = $ articleTable-> select() -> setIntegrityCheck (false); (в соответствии с руководством: http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.advanced.usage). –

+0

Да, вам нужно setIntegrityCheck (false); Благодаря! Я обновил код, чтобы он не вводил в заблуждение :) –