插入新行而不是更新当前行

时间:2011-04-26 00:31:17

标签: cakephp cakephp-1.3

嗨我遇到下面的代码问题 我正在做ajax,如果数据完全相同,它不会插入记录。但是如果文本区域中的文本发生更改,它应该更新记录,而是插入一个新行。

这是我的模特

<?php 
class Test extends AppModel {

    var $belongsTo = array('table1','table2');

        var $validate = array(
            'field1' => array(
                'rule' => 'duplicateCheck',
                'message' => 'Duplicate record'
            ),
            'textbody' => array(
                'rule' => 'duplicateCheck',
                'message' => 'Duplicate record'
            )
        );

        function duplicateCheck() {
            $conditions = array(
                'Test.field1' => $this->data['Test']['field1'],
                'Test.textbody' => $this->data['Test']['textbody']
            );
            return !$this->hasAny($conditions);
        }

}
?>

这是我的控制器

<?php

function add() {

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

        if($this->Test->save($this->data['Test'])) {

        } else {


            if(isset($this->Test->validationErrors['field1'])) {



            }
        }
    }



}   

?>

不确定如何解决这个问题 感谢

修改

好吧我把它更改为此但现在它不会更新字段

var $belongsTo = array('table1','table2');

    var $validate = array(
        'field1' => array(
            'rule' => 'duplicateCheck',
            'message' => 'Duplicate record'
        ),
        'userid' => array(
            'rule' => 'duplicateCheck',
            'message' => 'Duplicate record'
        )
    );

    function duplicateCheck() {
        $conditions = array(
            'Test.field1' => $this->data['Test']['field1'],
            'Test.userid' => $this->data['Test']['userid']
        );
        return !$this->hasAny($conditions);
    }

} ?&GT;

3 个答案:

答案 0 :(得分:1)

确保将PK传递给$ this-&gt; Model-&gt; save(),否则它将为PK字段创建一个新ID。另外,$ this-&gt;数据应该以$ this-&gt;数据的形式发送到包含模型名称的数据。因此,如果您的模型名称为Test,请尝试发送它:

$this->Test->save($this->data)

不是

$this->Test->save($this->data['Test'])

答案 1 :(得分:1)

如果$ this-&gt; data ['Test'] ['id']有值,则保存功能将更新记录而不是创建新记录。

由于只有Test.field1已经在表中才会更新记录,你需要在add()函数中进行另一次检查:

function add() {
    if(isset($this->data)) {
        $existingRecordId = $this->Test->find('first', array(
            'conditions' => array('Test.field1' => $this->data['Test']['field1']),
            'fields' => array('Test.id')
        ));
        if(sizeof($existingRecordId)>0)
            $this->data['Test']['id'] = $existingRecordId['Test']['id'];
        if($this->Test->save($this->data['Test'])) {
        } else {
            if(isset($this->Test->validationErrors['field1'])) {

            }
        }
    }
}

答案 2 :(得分:1)

在您的模型中尝试此代码:

'field_name' => array(
        'alphanumeric' => array(

            'rule' => array('isUnique'),

            'message' => 'Percentage Commision already set for this api',

            'allowEmpty' => false,

            //'required' => false,

            //'last' => false, // Stop validation after this rule

            //'on' => 'create', // Limit validation to 'create' or 'update' operations

        ),

假设您有一个名为“field_name”的字段。然后在你的模型中你可以放一个验证规则,它会自动处理。