Zend_Db_Table
is a 表数据网关. It
充当数据库表的网关。一个实例处理表中的所有行。
这意味着,每张桌子有一个班级。你的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()
or rollback()
取决于查询结果。
另请注意,从 ZF1.9 开始,您还可以创建 Zend_Db_Table 的实例,而不必先定义具体的子类,例如
$fooTable = new Zend_Db_Table('foo');
请参阅有关章节ZF 参考指南中的 Zend_Db_Table.