从Array - Zend填充后保存行

时间:2009-10-07 14:06:31

标签: zend-framework zend-db zend-db-table

再次成为Zend Framework的问题!任何帮助表示赞赏。

我有一个DB表类,我希望在发布表单时使用它来插入/更新行,并且我想使用save()方法,因此它们都可以通过相同的方法。


//Users Db Table class
class DBTables_Users extends Zend_Db_Table_Abstract
{
    protected $_name = "users";
    protected $_primary = "userID";
}

所以这是我的测试代码......

DBTables_Users

这完全没有“userID”项并且插入正常,但是如果我在其中添加,则尝试再次插入它并且出现重复键错误。

对我来说,行应该确认是否存在主键,并将其用作更新行的where子句。然而,在深入研究代码之后,它检查的唯一事情,确定它是插入还是更新,是否存在“_cleanData”变量,如果配置有一个“数据”选项,它在构造时填充它在使用时不会createRow方法。

我是以错误的方式解决这个问题,还是需要在重写中自行设置_cleanData属性的丑陋修复?

干杯 斯图尔特

2 个答案:

答案 0 :(得分:2)

当然,如果该条目是新条目,您将不会从表单中传递ID?

你不能快速检查是否为空或空,然后调用插入而不是更新?

如果他们执行不同的任务,请不要尝试用一种方法做太多事情。

下面是我的插入/更新方法的示例,该方法位于扩展Zend_Db_Table(Zend Framework 1.8)的类中

public function insertQuote($quote)
    {
        $data = array('id'=>null,'quote'=>$quote, 'dateCreated'=>NOW());
        $id = $this->insert($data);

        return $id;
    }

public function updateQuote($id, $quote)
    {
        $data = array(
        'quote'=>$quote
        );
        $this->update($data, 'id = ' . (int)$id);
    }

答案 1 :(得分:0)

这样的改变将使得无法插入具有用户指定的主键的行(例如,从序列中预取的自然主键)。它不能假设表已经包含该行,只是基于数组包含主键的事实。

您可以编写一个类似于createRow的新函数,用'stored' => true构造行实例。