2017-01-26 4 views
0

У меня есть таблица query с полем id который автоинкрементный первичный ключ.атрибут автоинкремента всегда равен нулю после сохранения()

Модель

class Query extends \yii\db\ActiveRecord 
{ 
    public static function tableName() 
    { 
     return '{{%query}}'; 
    } 

    public function rules() 
    { 
     return [ 
      [['id', 'created_at'], 'integer'], 
      [['data'], 'string'], 
     ]; 
    } 
} 

Применение

$q = new Query(); 
$q->created_at = time(); 
$q->data = Json::encode($query); 
if ($q->save()) 
    echo $q->id == null ? "null" : $q->id; 
else 
    echo "Validation error"; 

Результат null, хотя новая запись с идентификатором инкрементируется имеет место в базе данных.

Также я вижу только запись insert в журнале db, но нет записи для получения вставленного идентификатора строки.

Что случилось?

+0

то же самое произойдет ли при удалении 'PrimaryKey()' метод? – Bizley

+0

Почему вы переопределили метод primaryKey()? .. ActiveRecord уже этот метод – scaisEdge

+0

Ну, удалили 'primaryKey()'. Вызов неявных 'primaryKey()' возвращает ** ['id'] **, 'getPrimaryKey()' возвращает ** null **. – Alexey

ответ

0

, как вы можете видеть в поставщика/yiisoft/yii2/дб/ActiveRecord.php

уже есть метод PrimaryKey

public static function primaryKey() 
{ 
    return static::getTableSchema()->primaryKey; 
} 

, которые возвращают правильный PrimaryKey для tableSchema

так вы не должны переопределять этот метод.

метод специально называется primaryKey() not getPrimaryKey() .. этот последний является волшебным геттером .. и возвращает значение для вар $ PrimaryKey ..

если не вставка не выполняется может быть у вас есть какие-то проблемы валидации .. попробуйте (только для отладки) с помощью save(false)

+0

Вы правы, ведь я удалил свою реализацию primaryKey(). Но это не решает проблему, о которой я рассказывал. – Alexey

+0

, когда объясняю лучше, проблема «рассказывала» мне не понятна .. в любом случае ответ обновляется с кратким предложением – scaisEdge