【问题标题】:CakePHP saveAll- Updating a row in mysql instead of saving as a new rowCakePHP saveAll- 在 mysql 中更新一行而不是另存为新行
【发布时间】:2010-11-26 09:33:26
【问题描述】:

我正在尝试复制表单中的特定条目。我通过表单 ID 获取所有列值,并尝试使用 saveAll 将其保存为新行。但它不是创建新行,而是更新现有条目。

这是我的代码:

function duplicateForm($data)
   {
         $this->data['Form']['id']=$data['Form']['id'];
         $existingForm=$this->find('all',array('conditions'=>array('Form.id'=>$this->data['Form']['id'])));

         foreach($existingForm as $ex):
             $this->data['Form']['name']=$ex['Form']['name']." (copy)";
              $this->data['Form']['created_by']=$ex['Form']['created_by'];
               $this->data['Form']['access']=$ex['Form']['access'];
                 $this->data['Form']['status']='Incompleted';
                if($this->saveAll($this->data)) 
                {echo "Success";}
         endforeach;
   } 

我想可能是因为表单名称相同,所以它正在更新。所以我将“复制”字符串添加到表单的名称中。然而,旧条目只是在更新。

这些是我的表格“表格”的列及其类型:

    Field            Type   

  id                int(11)             
  name              varchar(25)     
  created_by        int(11)             
  access            varchar(10)     
  created           timestamp           
  modified          timestamp               
  status            varchar(15) 

id 字段是自增的,所以我想如果我给一个 save 方法,id 会自己生成。

【问题讨论】:

    标签: cakephp save


    【解决方案1】:

    Cake 通过id 字段的存在和数据库中id 的存在来决定是更新现有记录还是将数据保存为新记录。由于您包含了id,因此它将始终更新现有记录。

    您可以像这样大大简化您的代码:

    $form = $this->read(null, $data['Form']['id']);
    
    unset($form['Form']['id']);  // no id == new record
    $form['Form']['status'] = 'Incompleted';
    
    $this->create();
    $this->save($form);
    

    一般建议:不要将数组的内容一个一个地复制到另一个数组中,尤其是当它是您的模型数据时。首先,这很乏味,但更重要的是,如果您在 Form 表中添加新列,您要么必须搜索所有应该复制该新字段的位置,或者更有可能,您将引入有趣的错误,因为每当您复制 Form 时都会丢失该新字段。

    【讨论】:

    • 是的,它有效..感谢您的帮助和建议..我会避免一一复制数组的内容并使用这种方法..
    • 但是,如果我有许多具有相同 id(不是主 id)的记录,这种方法会起作用吗?如果有很多记录,我必须使用 for each 循环对吗?
    • 当然,如果您使用的不是主 ID,您可能会得到很多记录。在这种情况下请注意致电$this->create() 或使用saveAll()book.cakephp.org/view/75/Saving-Your-Data
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多