插入新行而不是更新

时间:2015-02-05 12:19:12

标签: cakephp cakephp-2.0 cakephp-1.3 cakephp-2.3

我正在尝试更新数据库中的配置文件而不将配置文件ID作为参数传递,而不是更新我正在添加新行。我尝试使用 getLastInsertId(),但它不起作用。

public function editProfile(){

    if (isset($this->data)){

        $Client = $this->Client->find('first', array(
        'fields' => array('email','username','first_name','surname','country','phone_prefix','phone'),
        'conditions' => array(
            'Client.email' => $this->request->query['email'],
            'Client.client_type' => $this->request->query['client_type']
             ),
        )
    );


 if($this->request->is('get')) {

        if($data = $this->Client->save($this->request->query,array('first_name','surname','country','phone_prefix','phone')))
        {
            $this->Client->id = $this->Client->getLastInsertId();

3 个答案:

答案 0 :(得分:1)

您似乎正在尝试根据电子邮件和客户端类型更新客户端模型中的记录,因为(我假设)您不知道ID。

尝试更改代码以根据您拥有的信息获取ID

public function editProfile(){

if($this->request->is('get')) {
  if (isset($this->data)){

    $conditions = array('conditions' => array(
            'email' => $this->request->query['email'],
            'client_type' => $this->request->query['client_type']
         ));
    $this->Client->id = $this->Client->field('id', $conditions);

    if($this->Client->save($this->request->query,array('id', 'first_name','surname','country','phone_prefix','phone')))
    {
      $this->setFlash('success');
    }else{
      $this->setFlash('fail');
    }
  }
}

答案 1 :(得分:1)

查看代码,您似乎有两个可能的键:

  1. 客户电子邮件
  2. 上次保存的ID
  3. 首先,使用上次保存的ID似乎非常脆弱 - 您如何确定这将始终是您要更新的记录?最好避免这种方法。

    但是,如果您有用户的电子邮件,则可以使用以下方法:

    $client = $this->Client->findByEmail($this->request->data['Client']['email']);
    $id = $client['Client']['id'];
    

    您现在可以在保存中使用客户端记录ID。类似的东西:

    $data = array();
    $data['Client']['id'] = $id;
    $data['Client']['fieldFromForm'] = $this->data['Client']['fieldFromForm'];
    
    $this->Client->save($data);
    

    ...

答案 2 :(得分:0)

如果没有id,cake会假设您要添加新客户端。要通过保存更新,您需要告诉它以某种方式更新哪个Client.id。是否有某些原因导致您无法提供Client.id?通常的方法是让Client.id出现在编辑视图的隐藏输入中,然后您可以将其传递给编辑操作......