save () возвращает false, но без ошибок в CakePHP - PullRequest
34 голосов
/ 23 февраля 2010

Мое значение отладки установлено на 2, и оно отображает все запросы, кроме того, который мне нужен.

У меня есть метод контроллера Items, который вызывает этот метод в модели User ( Элемент принадлежит пользователю ):

function add_basic($email, $password) {
    $this->create();

    $this->set(array(
        'email' => $email,
        'password' => $password
    ));

    if($this->save()) {
        return $this->id;
    }
    else {
        return false;
    }
}

Я подтвердил, что $email и $password правильно передаются в функцию (и заполнены достоверными данными). email и password - это имена полей в модели User.

Я также подтвердил, что на $this->save() он возвращает false, но когда я просматриваю страницу, где это происходит, запрос не печатается в отладке, и не выдается ошибка, поэтому я имею понятия не имею, что происходит не так.

Есть идеи о том, как я могу увидеть ошибку, или почему запрос, похоже, не выполняется?

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

Ответы [ 8 ]

42 голосов
/ 23 февраля 2010

Это, вероятно, даст вам необходимую информацию (если, конечно, она не сохраняется из-за неверных данных):

if(!$this->save()){
    debug($this->validationErrors); die();
}
13 голосов
/ 29 декабря 2013

содержит массив validationErrors

if ($this->save()) {
    return $this->ModelName->id;
}
else {
    debug($this->ModelName->invalidFields());
    return false;
}
10 голосов
/ 23 февраля 2010

Есть ли у вас метод beforeValidate() или beforeSave() в модели или модели приложения? Если так, они возвращают правду? В противном случае используйте отладчик, установите точку останова в вашей IDE в верхней части метода cake / libs / models / model.php save() и пошагово выполняйте код, пока он не вернет false. В противном случае добавьте die('here'); звонков.

8 голосов
/ 23 февраля 2010

Попробуйте это:

if ($this->save()) {
    return $this->id;
}
else {
    var_dump($this->invalidFields());
    return false;
}
3 голосов
/ 02 апреля 2014

Обязательно проверьте ваши таблицы:

  • Включено ли в ID автоматическое увеличение?
  • Является ли id вашим первичным ключом?

проблемы с auto_increment убили меня. Простой способ проверить: если какая-либо из ваших строк имеет ID = 0, скорее всего auto_increment отключен.

1 голос
/ 14 ноября 2018

@ cakePHP 3.6: После сохранения сущности любые ошибки валидации будут сохраняться в самой сущности Может читать методом getErrors ().

\Cake\Log\Log::debug($this->ModelName->getErrors());

Если вы включили библиотеку

use \Cake\Log\Log;

тогда вы можете получить доступ к ошибкам, как показано ниже:

Example: log::debug($contactRelationship->getErrors());

Ссылка: https://book.cakephp.org/3.0/en/orm/entities.html

0 голосов
/ 19 марта 2019

CakePHP 3.6

$entity = $this->Model->newEntity([
    'account_id' => $id,
    'gallery_id' => $gallery_id
]);

$result = $this->Model->save($entity);

print_r($entity->getErrors());
0 голосов
/ 29 апреля 2016

Другая ситуация, когда CakePHP не может сообщить о каких-либо $this->Model->validationErrors и нет других ошибок, возможно, когда $this->request->data не соответствует ожиданиям Cake и просто игнорирует ваши данные, не сохраняя и не проверяя ошибок. Например, если ваши данные предоставлены DataTables, вы можете увидеть этот формат $this->request->data[0]['Model']['some_field'].

$this->Model->save($this->request->data[0]) будет работать, однако.

...