代码之家  ›  专栏  ›  技术社区  ›  Stuart

从数组填充后保存行-Zend

  •  0
  • Stuart  · 技术社区  · 16 年前

    又是一个Zend框架问题!感谢您的帮助。

    我有一个DB table类,我想在发布表单时使用它来插入/更新行,我想使用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”变量的存在,该变量是在构造时填充的,前提是配置有一个“data”选项,而在使用createRow方法时它没有这个选项。

    我这样做是错误的,还是需要一个丑陋的解决方案,在覆盖中自己设置_cleanData属性?

    干杯 斯图尔特

    2 回复  |  直到 16 年前
        1
  •  2
  •   Andrew    16 年前

    当然,如果条目是新条目,您的表格中不会传递ID吗?

    你不能快速检查一下它是空的还是空的,然后调用insert而不是update吗?

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

    下面是我的insert/update方法的一个例子,它位于一个扩展Zend_Db_表(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
  •  0
  •   LukáÅ¡ Lalinský    16 年前

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

    您可以编写一个新函数,类似于 createRow ,它用 'stored' => true .