Большинство людей считают модель совпадающей с классом таблицы. Фактически, они делают модели extension базовым классом таблиц. Для самой простой работы типа CRUD это более или менее хорошо. Но когда вы получаете более сложные обновления для нескольких таблиц или сценариев транзакций, вы обнаруживаете неловкие ситуации, подобные той, о которой вы спрашиваете.
Фактически, модель не является таблицей. Модель - это инкапсуляция некоторой логической части бизнеса вашего приложения, а не реализация ее хранения в базе данных.
Я работал над кодом Zend_Db_Table несколько лет назад, и когда я писал руководство, я был осторожен , а не , чтобы ссылаться на классы таблиц как на Модели.
Таким образом, вам может потребоваться ввести настоящий уровень класса Model (который не расширяет базовый класс), который знает, как выполнять определенные специфичные для приложения операции с одной или несколькими таблицами базы данных, но это не контроллер вашего приложения.
Controller -> Model -> Table(s)
Эта архитектура - отличный способ избежать повторения кода, если у вас есть похожие бизнес-задачи, которые вызываются из нескольких контроллеров. Это помогает отделить функции приложения и сведения о сохранении от ваших контроллеров, что имеет преимущества в обслуживании кода, тестируемости, инкапсуляции и т. Д.
Ознакомьтесь с бесплатной мини-книгой Быстро управляемый доменом (на основе книг Эрика Эванса) или главой "Магические бобы" в моей книге, Антипаттерны SQL: предотвращение ловушек Программирование базы данных .