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.
person
Gordon
schedule
12.03.2010