Как обновить существующую запись в CakePHP?

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

$data = array('Id' => $id, 'Approved' => 12);
$this->names->save($data);

это приводит к

SQLSTATE [23000]: нарушение ограничения целостности: 1062 Дублирующаяся запись 4 для ключа PRIMARY

И если я сделаю это

$this->names->Id=$id;

Он добавляет новую запись. Как мне это исправить?


person user3337590    schedule 17.03.2014    source источник
comment
Я думаю, что вы не следуете правилам торта. Название модели должно начинаться с заглавной буквы   -  person Moyed Ansari    schedule 17.03.2014
comment
Мойед Ансари - это не имеет отношения к вопросу, который он задал.   -  person xil3    schedule 30.05.2017


Ответы (4)


Ключ должен быть id, а не Id. Если в вашей таблице вы не можете использовать идентификатор (нижний регистр) и вам нужно использовать идентификатор (верхний регистр), вы должны установить его в файле модели.

также вы не следуете соглашениям: модель должна быть именем, а не именами (единственное число и CamelCase)

person arilia    schedule 17.03.2014

Если вы намеренно не следуете соглашениям об именах Cake (по уважительной причине), вам следует их придерживаться. Это означает, что модели должны быть названы в единственном числе с заглавной буквы, а поля таблицы должны быть в нижнем регистре. Кроме того, ваш массив данных должен иметь имя модели, которую вы хотите сохранить.

So:

$data = array('Name' => array('id' => $id, 'approved' => 12));
$this->Name->save($data);
person Roberto Maldonado    schedule 17.03.2014

Чтобы обновить значение одного поля при наличии первичного ключа, saveField() также доступен.

Цитата из документация:

Model::saveField(string $fieldName, string $fieldValue, $validate = false)

Используется для сохранения одного значения поля. Установите идентификатор модели ($this->ModelName->id = $id) непосредственно перед вызовом saveField(). При использовании этого метода $fieldName должно содержать только имя поля, а не имя модели и поля. Например, чтобы обновить заголовок сообщения в блоге, вызов saveField из контроллера может выглядеть примерно так:

$this->Post->saveField('title', 'A New Title for a New Day');

Он также имеет возможность передавать такие параметры, как validate, callbacks и т. д., используя альтернативный синтаксис:

saveField(string $fieldName, string $fieldValue, array $params = array())

Ссылки: Документация, API

person Community    schedule 07.10.2014

person    schedule
comment
Следуйте приведенному выше фрагменту кода, он создает новую запись, но не обновляет. - person Do Nhu Vy; 23.12.2014
comment
@DoNhuVy Обратите внимание, что $id должен быть равен вашему идентификатору в вашей базе данных. Это ключ к сохранению обновления вместо вставки. Вы ДОЛЖНЫ установить первичный ключ модели на уже существующий первичный ключ. - person Millar248; 03.05.2018