Как изменить имя Zend_Db_Table в модели для вставки в несколько таблиц

Используя Zend Framework, я создал модель для вставки записи в базу данных. Мой вопрос, после $this->insert($data) как я могу переключить активную таблицу, чтобы я мог вставить запись в другую таблицу?

Вот мой код:

 class Model_DbTable_Foo extends Zend_Db_Table_Abstract { protected $_name = 'foo'; public function addFoo($params) { $data = array( 'foo' => $params['foo'], ); $this->insert($data); $foo_id = $this->getAdapter()->lastInsertId(); $data2 = array( 'bar' => $params['bar'] ); // I need to change the Db Table name here. $this->insert($data2); $bar_id = $this->getAdapter()->lastInsertId(); } } 

Zend_Db_Table – это шлюз данных данных . Это

выступает в качестве шлюза к таблице базы данных. Один экземпляр обрабатывает все строки в таблице.

Это означает, что у вас есть один класс за стол. Ваш Model_DbTable_Foo представляет таблицу Foo в вашей базе данных и только в этой таблице. Он не должен вставлять в другие таблицы. Для этого вы бы использовали другой класс таблицы. Самый чистый вариант – добавить еще один слой поверх TDG, который знает, как обрабатывать вставки в несколько таблиц, например

 class Model_Gateway_FooBar { protected $_tables; public function __construct(Zend_Db_Table_Abstract $foo, Zend_Db_Table_Abstract $bar) { $this->_tables['foo'] = $foo; $this->_tables['bar'] = $bar; } public function addFoo($data) { $this->_tables['foo']->insert($data['foo']); // yaddayaddayadda $this->_tables['bar']->insert($data['bar']); } } 

Тем не менее, это ваше приложение, и вы можете решить не беспокоиться и просто создать новый экземпляр другого класса в классе Foo и сделать там вставку, например

 $otherTable = new Model_DbTable_Bar; $otherTable->insert($data); 

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

Если вы используете несколько вставок, вы можете использовать транзакции, чтобы обе вставки работали, как ожидалось, например,

 $this->_tables['foo']->getAdapter()->beginTransaction(); 

а затем commit() или rollback() зависимости от результата запроса.

Также обратите внимание, что с ZF1.9 вы также можете создавать экземпляры Zend_Db_Table, не указывая сначала конкретный подкласс, например

 $fooTable = new Zend_Db_Table('foo'); 

См. Главу « Zend_Db_Table» в справочном руководстве ZF .

Я думаю, вы должны иметь еще один Model_DbTable , Model_DbTable_Bar и называть его либо

внутренне :

 class Model_DbTable_Foo ... { public function addFooAndBar() { ... $bar = new Model_DbTable_Bar(); $bar->insert($data2); } } 

или извне :

 class ModelX ... { public function addFoos() { $foo = new Model_DbTable_Foo(); $foo->insert($data); $bar = new Model_DbTable_Bar(); $bar->insert($data2); } } 

Также вы можете использовать класс Zend_Db_Table . Что-то вроде этого:

  $fooTbl = new Zend_Db_Table('foo'); $lastFooID = $fooTbl->insert($data2) ->getAdapter() ->lastInsertId();