Используя 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();