Существует несколько способов достижения этого, однако, какой из них вы выберете, зависит от ваших обстоятельств.
1) Разорвать связь между вашими объектами и вашей базой данных
Напишите ваши объекты, чтобы не иметь связи с таблицами вашей базы данных. Сначала нормализуйте таблицы базы данных, затем посмотрите, как пользователь вашего приложения будет взаимодействовать с вашими данными. Смоделируйте данные с объектами, но не привязывайте каждый объект к таблице (то есть с помощью класса Zend_DB_Table_Abstract)
После того, как вы создали свои объекты, напишите классы mapper, которые отображают ваши объекты обратно в соответствующие таблицы в вашей базе данных. Это классы, расширяющие Zend_DB_Table (при необходимости).
Вы можете обрабатывать объединения двумя способами: либо отобразить соединения с помощью функции отношений Zend_DB_Table, либо (ИМХО лучший выбор) просто использовать Zend_DB_Select, чтобы сделать соответствующие методы в вашем классе сопоставления.
Итак, у вас есть два класса (вероятно, для каждой таблицы, но не всегда)
Person
PersonMapper
В вашем коде, когда вы хотите работать с некоторыми объектами, либо создайте новый объект
$person = new Person();
$person->setName('andrew taylor');
Затем напишите передать мапперу, чтобы сохранить его:
$personMapper = new PersonMapper();
$pesonnMapper->save($person);
Или, сделайте это по-другому:
$personMapper = new PersonMapper();
$person = personMapper->load(29);
$person->setName('joe bloggs');
$personMapper->save($person);
Следующим шагом здесь будет класс коллекции, основанный на SPL :
$personList = $personMapper->loadAllMen();
foreach($personList AS $person) {
echo $person->getName();
}
Где $ personMapper-> loadAllMen () - это такой метод:
$select = $this->select();
$select=>where('gender = "Male"');
$zendDbRows = this->fetchAll($select);
return new PersonList($zendDbRows);
2) MySQL Views
Если у вас много объединенных таблиц, в которых по одному соединению имеется одна строка, то вы объединяете информацию о клиенте на основе идентификатора в таблице заказов и делаете это только для чтения (так что вы не Если вы не хотите обновлять какую-либо информацию через адаптер Zend_DB_Table), вы создаете свои нормализованные таблицы, а затем - одно представление сверху. Представление обрабатывает соединения за кулисами, поэтому через Zend создается впечатление, что вы подключаетесь к одному столу.
Есть некоторые предостережения, связанные с этим, у представлений MySQL есть некоторые проблемы с производительностью (именно поэтому лучше всего использовать однорядные объединения FK), и они строго предназначены только для чтения.