Обновить строки в CakePHP

Я пытаюсь обновить строку в cakePHP 2.3.1. У меня есть класс Test, расширяющий AppModel с помощью массива $validates, и контроллер (упрощенный):

public function editstudent()   {
    if($this->request->data)    {
        $this->Test->stuId= $this->data['Test']['stuId'];
        if ($this->Test->save($this->request->data))    {
            $this->set('state',1);
        }
    }

В книге говорилось, что:

Создание или обновление управляется полем идентификатора модели. Если установлен $Model->id, запись с этим первичным ключом обновляется. В противном случае создается новая запись:

Как и выше, я установил $this->Test->StuId, но когда я отправляю форму, она все равно показывает:

Ошибка: SQLSTATE [23000]: нарушение ограничения целостности: 1062 Дублирующаяся запись '' для ключа 'PRIMARY' SQL-запрос: INSERT INTO ........

Как показала ошибка, запрос по-прежнему INSERT, а не UPDATE Итак, что мне нужно сделать для обновления, пожалуйста, помогите мне :(

РЕДАКТИРОВАТЬ: @thaJeztah Я отредактировал свое представление следующим образом:

class Test extends AppModel {
var $name= 'Test';
var $primaryKey= 'stuId';
public $validate= array(.......);
}

Но это все еще показывает ту же проблему

Ошибка базы данных Ошибка: SQLSTATE [23000]: нарушение ограничения целостности: 1062 Дублирующаяся запись '' для ключа 'PRIMARY' SQL-запрос: INSERT INTO cakePhp.tests (stuName, stuDoB, stuAdd) VALUES ('Đào Đức Anh', '2013-03 -25 ', 'Ким Лиен')

Как вы видите, запрос все еще INSERT, а не UPDATE, можете ли вы помочь мне, почему это все еще происходит :(


person Duc Anh    schedule 22.03.2013    source источник
comment
Какова структура вашей таблицы tests?   -  person dhofstet    schedule 22.03.2013
comment
В таблице «тесты» есть 5 полей: первичный ключ: stuId и еще 4 поля: stuName, stuSex, stuDoB, stuAdd.   -  person Duc Anh    schedule 22.03.2013


Ответы (1)


Поскольку вы не следуете соглашениям CakePHP (см. Соглашения о модели CakePHP, вам нужно будет вручную указать первичный ключ и/или таблицу базы данных для использования в модели;

class Test extends AppModel {
    public $primaryKey = 'studId';
}

Кроме того, мне интересно, является ли «Тест» зарезервированным именем и может вообще не быть именем собственным для модели.

Однако, если это новый проект, я настоятельно рекомендую придерживаться соглашений CakePHP, они существуют не просто так и значительно облегчат жизнь при разработке с использованием этого фреймворка.

обновить Удалено свойство $useTable на основе комментария ОП.

person thaJeztah    schedule 22.03.2013
comment
Я не понимаю вашу точку зрения. Поскольку, как я знаю о соглашении о тортах, класс Test extends AppModel будет придерживаться тестов таблицы в базе данных, поэтому мне не нужно указывать это, как ваш код выше? - person Duc Anh; 22.03.2013
comment
Хорошо, если ваша таблица называется «test», вы можете удалить свойство «useTable», однако, если ваш первичный ключ называется не «id», а «studId», вам следует указать это. - person thaJeztah; 22.03.2013
comment
Это означает, что cakePhp не сможет сам определить, что является первичным ключом в моей таблице, верно? Я не думал об этом, спс чувак. - person Duc Anh; 22.03.2013
comment
Вот для чего нужны соглашения; по умолчанию вы должны использовать «id» в качестве имени для первичного ключа и использовать [modelname]_id в качестве внешнего ключа к модели (например, test_id). Имена полей должны быть строчными, слова разделены символом подчеркивания. - person thaJeztah; 22.03.2013