Zend Framework - обновление двух таблиц из одной модели - PullRequest
1 голос
/ 24 августа 2011

У меня есть модель (назовите ее Model_A), которую я использую для CRUD в конкретной таблице, определенной $ name var.Мне также нужно обновить другую таблицу (назовите ее Model_B с другим $ name var), если первая операция в другой модели прошла успешно.

Я пытаюсь обновить таблицу, представленную в Model_B, из действия в классе Model_A,Я делаю это, создавая экземпляр Model_B внутри действия в Model_A.Действие обновления завершается неудачно, потому что оно пытается записать в таблицу $ name из Model_A вместо таблицы $ name из экземпляра Model_B.

Полагаю, я мог бы передать результат первого обновления обратнок контроллеру, а затем перейти ко второй модели, но я бы предпочел сделать оба обновления одновременно.

Помимо ошибки в моем кодировании, есть ли очевидная причина, по которой мое второе обновление не находитправильная таблица ... и это разумный подход к тому, что я хочу сделать?

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

Большинство людей считают модель совпадающей с классом таблицы. Фактически, они делают модели extension базовым классом таблиц. Для самой простой работы типа CRUD это более или менее хорошо. Но когда вы получаете более сложные обновления для нескольких таблиц или сценариев транзакций, вы обнаруживаете неловкие ситуации, подобные той, о которой вы спрашиваете.

Фактически, модель не является таблицей. Модель - это инкапсуляция некоторой логической части бизнеса вашего приложения, а не реализация ее хранения в базе данных.

Я работал над кодом Zend_Db_Table несколько лет назад, и когда я писал руководство, я был осторожен , а не , чтобы ссылаться на классы таблиц как на Модели.

Таким образом, вам может потребоваться ввести настоящий уровень класса Model (который не расширяет базовый класс), который знает, как выполнять определенные специфичные для приложения операции с одной или несколькими таблицами базы данных, но это не контроллер вашего приложения.

Controller -> Model -> Table(s)

Эта архитектура - отличный способ избежать повторения кода, если у вас есть похожие бизнес-задачи, которые вызываются из нескольких контроллеров. Это помогает отделить функции приложения и сведения о сохранении от ваших контроллеров, что имеет преимущества в обслуживании кода, тестируемости, инкапсуляции и т. Д.

Ознакомьтесь с бесплатной мини-книгой Быстро управляемый доменом (на основе книг Эрика Эванса) или главой "Магические бобы" в моей книге, Антипаттерны SQL: предотвращение ловушек Программирование базы данных .

2 голосов
/ 24 августа 2011

Zend_Db_Table имеет важное свойство, называемое "RefrenceMap", в котором вы определяете логику, как ваша одна таблица ссылается на другую, проверяйте приведенный ниже URL, чтобы читать дальше http://framework.zend.com/manual/en/zend.db.table.relationships.html

...