Zend_Db_Table
является Table Data Gateway. Это
действует как шлюз к таблице базы данных. Один экземпляр обрабатывает все строки в таблице.
Это означает, что у вас есть один класс за стол. Ваш 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);
Другим вариантом было бы поместить логику в контроллер, но я не могу рекомендовать его, потому что это не входит в обязанности контроллера и, как правило controllers should be kept thin and models should be fat.
На стороне, когда вы делаете несколько вставок, вы можете использовать транзакции, чтобы обе вставки работали, как ожидалось, например.
$this->_tables['foo']->getAdapter()->beginTransaction();
, а затем commit()
или rollback()
в зависимости от результата запроса.
Также обратите внимание, что с ZF1.9 вы также можете создавать экземпляры Zend_Db_Table без необходимости определять конкретный подкласс сначала, например.
$fooTable = new Zend_Db_Table('foo');
См. Главу Zend_Db_Table in the ZF Reference Guide.
Отличный совет! Я забыл все о транзакциях, я определенно хочу их использовать. Благодаря! – jwhat
Gordon, не могли бы вы объяснить, почему я хотел бы набирать cast $ foo и $ bar в конструкторе как Zend_Db_Table_Abstract вместо моих пользовательских Model_DbTable_Foo и Model_DbTable_Bar? – jwhat
Просто примечание для всех, кто интересуется транзакциями MySQL: мне пришлось изменить свой тип БД из MyISAM в InnoDB для поддержки транзакций. – jwhat