3

使用 Zend 框架,我创建了一个模型来将记录插入数据库。我的问题是,$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();
  }
}
4

3 回答 3

6

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');

请参阅ZF 参考指南中有关 Zend_Db_Table 的章节。

于 2010-03-12T23:49:24.403 回答
1

我想你应该有另一个Model_DbTableModel_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);
  }
}
于 2010-03-12T23:48:34.273 回答
0

您也可以使用Zend_Db_Table类。像这样的东西:

 $fooTbl = new Zend_Db_Table('foo');
 $lastFooID = $fooTbl->insert($data2)
                     ->getAdapter()
                     ->lastInsertId();
于 2012-10-03T09:31:01.817 回答