插入新行而不是更新

Inserting new row instead of Updating

我正在尝试更新数据库中的配置文件而不将配置文件 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();

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

您似乎正在尝试根据电子邮件和客户端类型更新客户端模型中的记录,因为(我假设)您不知道 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. 客户邮箱
  2. 最后保存的id

首先,使用最后保存的 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);

...