【问题标题】:Saving row after populating from Array - Zend从数组填充后保存行 - Zend
【发布时间】:2009-10-07 14:06:30
【问题描述】:

又是一个 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 属性?

干杯 斯图尔特

【问题讨论】:

  • 我的回答是否解决了这个问题,还是您需要更多信息?谢谢

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


【解决方案1】:

如果条目是新条目,您肯定不会从表单中传递 ID 吗?

您不能快速检查一下它是 null 还是空,然后调用插入而不是更新吗?

不要尝试用一种方法做太多事情,如果他们做了不同的任务,就把它们分开。

这是我的插入/更新方法的示例,它位于扩展 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);
    }

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是一个公平的观点。有没有办法指示要手动更新/插入该行?像 MODIFIED 标志之类的?
    猜你喜欢
    • 2019-07-04
    • 2023-03-14
    • 2012-11-11
    • 1970-01-01
    • 2021-11-17
    • 2017-12-16
    • 2014-05-31
    • 2018-05-04
    • 1970-01-01
    相关资源
    最近更新 更多