Я использую ZF в течение нескольких месяцев, и я действительно доволен этим, но я не совсем уверен в том, как работать с отношениями с моделями и в то же время избегать нескольких запросов к дБ. У многих людей есть эта проблема, и никто, кажется, не находит для нее хорошего решения. (и избегать использования стороннего ORM) Например, у меня есть список пользователей, и каждый пользователь принадлежит к группе. Я хочу, чтобы список пользователей отображал информацию о пользователе и имя группы (для таблиц: пользователей и групп. У пользователей есть внешний ключ для групп таблиц). У меня есть: 2 класса сопоставления для обработки этих таблиц, UserMapper и GroupMapper. 2 Модели Классы пользователей и группы классы 2 Источника данных, который расширяет Zend_Db_Table_AbstractZend Framework - отношения и оптимизация ORM
в пользовательском картографе я могу сделать findParentRow для того, чтобы получить информацию о группе каждого пользователя, но проблема у меня есть дополнительный запрос для каждой строки, это нехорошо, я думаю, когда с присоединением я могу сделать это только в одном. Конечно, теперь мы должны сопоставить этот результат с объектом. поэтому в моем абстрактном классе Mapper я пытаюсь загрузить загружаемые таблицы для каждой родительской строки с использованием псевдонимов столбцов (аналогично Yii .. я думаю), поэтому я получаю в одном запросе объект значения, подобный этому // Объект модели пользователя
$userMapper= new UserMapper();
$users= $userMapper->fetchAll(); //Array of user objects
echo $user->id;
echo $user->getGroup()->name // $user->getParentModel('group')->name // this info is already in the object so no extra query is required.
Я думаю, вы поняли мою суть ... Есть ли у вас собственное решение, возможно, более академичное, чем мое, для того чтобы сделать это, не избегая нескольких запросов? // Zend db table выполняет дополнительные запросы, чтобы получить метаданные, которые хорошо и могут быть кэшированы. Моя проблема заключается в том, чтобы получить информацию о родительской строке ... например, в yii ... что-то вроде этого $ userModel-> with ('group') -> fetchAll(); Спасибо.
Я борюсь с той же проблемой. Я думаю, что основная проблема заключается в том, что 'Zend_Db_Table' является реализацией TableDataGateway (TDG). Он достаточно гибкий, чтобы иметь дело со связанными таблицами, но без пользовательских запросов с использованием объединений вы получаете несколько запросов, как вы определили. Именно это несоответствие между TDG и моими реальными потребностями, которые часто подталкивают меня к сторонней ORM, вроде Doctrine. –
Точно, но Доктрина слишком велика для проектов, с которыми я обычно работаю. , поэтому я стараюсь полагаться только на классы Zend, когда это возможно, и сохраняйте его простым. Я не знаю, какие планы для Zend_db и связанных классов в ZF2, но я надеюсь, что у нас могут быть некоторые улучшения ... ZF2 должен быть выпущен этим летом/осенью. Думаю – FranStrentz
API ZF2 'Zend \ Db \ Table' будет вероятно, будет функционально таким же, как для ZF1 'Zend_Db_Table'; оба являются, в конце концов, реализациями TDG. К сожалению, вряд ли разумно ожидать, что ZF2 разрешит это фундаментальное напряжение TDG/mapper/join/use-case. –