0

又是一个 Zend 框架问题!任何帮助表示赞赏。

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


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

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


$userArray = array( 'userID' => 1,
      'firstName' => 'Test',
      'lastName' => 'Test',
      'emailAddress' => 'test@hotmail.com'
      );

$user = new DBTables_Users();

$newUserRow = $user->createRow($userArray);

$newUserRow->save();

这在没有“userID”项目的情况下完美地工作并且插入很好,但是如果我添加它,它会尝试再次插入它并出现重复键错误的错误。

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

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

干杯斯图尔特

4

2 回答 2

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);
    }
于 2009-10-08T19:59:18.193 回答
0

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

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

于 2009-10-07T14:20:02.023 回答