Неправильный формат created_at

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Erik
Сообщения: 80
Зарегистрирован: 2014.12.09, 14:40

Неправильный формат created_at

Сообщение Erik »

У меня в таблице поле created_at определено как TimeStamp. В модели есть TimestampBehavior::className(), При создании записи выскакивает Invalid datetime format: 1292 Incorrect datetime value: '1423049189' for column 'created_at' at row 1
Пробовал добавить 'attributes' => ['created_at', 'updated_at'], тогда писало что call_user_func() expects parameter 1 to be a valid callback, class 'created_at' not found

Еще вопрос влияют ли как то комментарии * @property string $created_at и какого типа должна быть created_at в модели?
Аватара пользователя
maleks
Сообщения: 1992
Зарегистрирован: 2012.12.26, 12:56

Re: Неправильный формат created_at

Сообщение maleks »

в базе данных тип столбца должен быть int
Аватара пользователя
denisOgr
Сообщения: 133
Зарегистрирован: 2012.02.02, 13:18
Контактная информация:

Re: Неправильный формат created_at

Сообщение denisOgr »

TimestampBehavior - это класс поведения в котором вы можете сами настроить формат. У вас формат хранения не соответствует тому что генерит поведения
ЧТо бы изменить формат записи можете использовать анонимные функции.

Код: Выделить всё

public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'createdAtAttribute' => 'created_at',
                'updatedAtAttribute' => 'updated_at',
                'value' => function(){ return date('Y-m-d');},
            ],
        ];
    }
 
Более подрбнее как можно задать формат, есть тут http://www.yiiframework.com/doc-2.0/yii ... lue-detail

Комментарии к классу никак не влияют на код. Они влияют на понимания кода и на взаимодействие кода с IDE
Erik
Сообщения: 80
Зарегистрирован: 2014.12.09, 14:40

Re: Неправильный формат created_at

Сообщение Erik »

Я провел эксперимент подставил в и TimestampBehavior value => 1 все равно получаю Incorrect datetime value: '1423069878' Это значить что Behavior не работает при наследовании?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Неправильный формат created_at

Сообщение zelenin »

Erik писал(а):Я провел эксперимент подставил в и TimestampBehavior value => 1 все равно получаю Incorrect datetime value: '1423069878' Это значить что Behavior не работает при наследовании?
вам показывают пример с анонимкой, а вы подставляете 1.
Либо Expression либо анонимка
german.igortcev
Сообщения: 251
Зарегистрирован: 2014.08.18, 14:01

Re: Неправильный формат created_at

Сообщение german.igortcev »

Бл* у меня печальнее у меня timestamp не понятно откуда милисикунды вклеивает только в log Dbtarget .

такого вида 1423069878 превращает в 1423069878.0000
Erik
Сообщения: 80
Зарегистрирован: 2014.12.09, 14:40

Re: Неправильный формат created_at

Сообщение Erik »

Я отдебажил что там внутри делается. Могу сказать, что параметр value равен null! То есть что то с регистрацией не ладно.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Неправильный формат created_at

Сообщение zelenin »

Erik писал(а):Я отдебажил что там внутри делается. Могу сказать, что параметр value равен null! То есть что то с регистрацией не ладно.
я вам уже указал на ошибку, вы не написали, что исправили. покажите код.
Erik
Сообщения: 80
Зарегистрирован: 2014.12.09, 14:40

Re: Неправильный формат created_at

Сообщение Erik »

К сожалению я вас просто не понимаю.
Мой последний вариант: 'timestamp' => [
'class' => TimestampBehavior::className(),
'value' => function(){ return date('U'); }, // unix timestamp

Я отдебажил до этой функции:

Код: Выделить всё

protected function getValue($event)
    {
        if ($this->value instanceof Expression) {
            return $this->value;
        } else {
            return $this->value !== null ? call_user_func($this->value, $event) : time();
        }
    } 
Что находится в $this->value не показывается! Но возвращает тоже что и time() хотя выполняет call_user_func. Как посмотреть что в Object of class Closure не ясно. Пробовал $this->value->expression вылетает.
Последний раз редактировалось Erik 2015.02.06, 15:24, всего редактировалось 1 раз.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Неправильный формат created_at

Сообщение zelenin »

Erik писал(а):К сожалению я вас просто не понимаю.
Мой последний вариант: 'timestamp' => [
'class' => TimestampBehavior::className(),
'value' => function(){ return date('U'); }, // unix timestamp

Я отдебажил до этой функции:

Код: Выделить всё

protected function getValue($event)
    {
        if ($this->value instanceof Expression) {
            return $this->value;
        } else {
            return $this->value !== null ? call_user_func($this->value, $event) : time();
        }
    }
Что находится в $this->value не показывается! Но возвращает тоже что и time() хотя выполняет call_user_func.
ну так все верно.
1. проверяем не является ли value Expression $this->value instanceof Expression. Если нет, то
2. проверяем не неопределенный ли $this->value $this->value !== null. если нет
3. выполняем анонимку, в вашем случае это date('U'), возращающий unix timestamp.
4. Если же value неопределен, то присваиваем time(), который возвращает тот же unix timestamp.
Erik
Сообщения: 80
Зарегистрирован: 2014.12.09, 14:40

Re: Неправильный формат created_at

Сообщение Erik »

Может быть и верно, но в базу не пишет!
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Неправильный формат created_at

Сообщение zelenin »

Erik писал(а):Может быть и верно, но в базу не пишет!
а это уже другой вопрос. может валидацию не проходит. может атрибут в правилах не прописан.
Erik
Сообщения: 80
Зарегистрирован: 2014.12.09, 14:40

Re: Неправильный формат created_at

Сообщение Erik »

Нашел!!!!!!!!
Вот правильное выражение: 'value' => new Expression('CURRENT_TIMESTAMP()'),
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Неправильный формат created_at

Сообщение zelenin »

Erik писал(а):Нашел!!!!!!!!
Вот правильное выражение: 'value' => new Expression('CURRENT_TIMESTAMP()'),
этот пример указан в доках, только там now(). А возвращает эта функция не unix timestamp, который вы пытались записать в БД. Соответственно и не получалось.
Ответить