вставка новой строки вместо обновления текущей - PullRequest
2 голосов
/ 26 апреля 2011

привет, у меня проблема с кодом ниже, я делаю 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);
    }

}?>

Ответы [ 3 ]

1 голос
/ 27 апреля 2011

Если $ this-> 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'])) {

            }
        }
    }
}
1 голос
/ 27 апреля 2011

Попробуйте этот код в вашей модели:

'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". тогда в вашей модели вы можете просто добавить правило проверки, и оно позаботится автоматически.

1 голос
/ 26 апреля 2011

Убедитесь, что вы передаете PK в $ this-> Model-> save (), иначе он создаст новый идентификатор для поля PK.Кроме того, данные $ this-> должны быть отправлены в файл сохранения как $ this-> data с указанием названия модели.Поэтому, если ваша модель называется Test, попробуйте отправить ее следующим образом:

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

NOT

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