Проблема проектирования данных MVC с Zend Framework - PullRequest
2 голосов
/ 09 октября 2008

Если у меня есть класс, представляющий доступ к одной таблице в моей базе данных в отношении class: table, я могу скрыть детали таблицы в одном классе. Но, как и любое полезное приложение, мне нужно запросить несколько таблиц. Как я могу приспособить это, используя класс: дизайн стола?

1 Ответ

2 голосов
/ 09 октября 2008

Существует несколько способов достижения этого, однако, какой из них вы выберете, зависит от ваших обстоятельств.

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), и они строго предназначены только для чтения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...