gpt4 book ai didi

php - 如何更改模型中的 Zend_Db_Table 名称以插入多个表

转载 作者:可可西里 更新时间:2023-11-01 00:27:42 25 4
gpt4 key购买 nike

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

最佳答案

Zend_Db_Table 是一个 Table Data Gateway .它

acts as a Gateway to a database table. One instance handles all the rows in the table.

这意味着,每张 table 都有一个类(class)。您的 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);

另一种选择是将逻辑放入 Controller 中,但我不推荐这样做,因为这不是 Controller 的责任,而且通常是 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 的章节.

关于php - 如何更改模型中的 Zend_Db_Table 名称以插入多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2436461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com