再次成为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属性的丑陋修复?
干杯 斯图尔特
答案 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
构造行实例。