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