TimestampBehavior возвращает timestamp при заданном Expression

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

TimestampBehavior возвращает timestamp при заданном Expression

Сообщение nickdenry »

Всем привет!

Имею свежесгенерированную модель Developer, пытаюсь добавить TimestampBehavior как написано в документации:

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

    public function behaviors()
    {
        return [
            [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                    ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
                    // if you're using datetime instead of UNIX timestamp:
                    'value' => new Expression('NOW()'),
                ],
            ],
        ];
    }
 
В результате в запросах timestamp

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

UPDATE `developer` SET `updated_at`='1448080678' WHERE `id`=8
а в полях, соотвественно 0000-00-00 00:00:00

Версия Yii 2.0.6, посмотрел код yii\behaviors\TimestampBehavior, вроде бы все корректно

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

    /**
     * @inheritdoc
     */
    protected function getValue($event)
    {
        if ($this->value instanceof Expression) {
            return $this->value;
        } else {
            return $this->value !== null ? call_user_func($this->value, $event) : time();
        }
    }

БД MySQL, на запрос SELECT NOW( ) возвращает текущую дату. При попытке использовать анонимную функцию - резульат тот же.


Что делаю не так?
Ответственные программисты с высоким уровнем технического долга (c)
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение Евгений Емельянов »

А у Вас в БД поле 'updated_at' какой тип имеет?
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение nickdenry »

@Евгений Емельянов 'created_at', 'updated_at' - оба datetime. Если я правильно понял, 'value' => new Expression('NOW()'), как раз для datetime полей, но в запросе я имею timestamp.
Ответственные программисты с высоким уровнем технического долга (c)
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение Евгений Емельянов »

Если у Вас поля создания и обновления - 'created_at' и 'updated_at', то не нужно их переопределять. Просто сделайте

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

public function behaviors()
    {
        return [
            TimestampBehavior::className(),
        ];
    } 
А в БД эти поля должны иметь тип INT(11)
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение nickdenry »

@Евгений Емельянов спасибо, я рассмотрю это как вариант. НО мой вопрос все-таки был о другом - как заставить TimestampBehavior работать с datetime, а не timestamp.
Ответственные программисты с высоким уровнем технического долга (c)
Евгений Емельянов
Сообщения: 167
Зарегистрирован: 2015.06.10, 10:43

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение Евгений Емельянов »

Да, я понял Ваш вопрос. Только забыл упомянуть, что когда начинал изучать Yii2 тоже сталкивался с такой проблемой и где-то нашел объяснение, что по философии Yii2 предпочтительно время хранить в метке юникс - мол, под это фреймворк заточен... Я эту проблему не смог победить и все таблицы делаю с полями под Timestampbehavior без переопределений этого поведения.

А как заставить, может более опытные товарищи подскажут. Только что-то пока тишина....
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение R3D3 »

Попробуй так:

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

public function behaviors()
    {
        return [
            'timestamp' => [
                'class' => TimestampBehavior::className(),
                
                ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
                'value' => new Expression('NOW()'),
                
            ],
        ];
    }
 
Yii Jabber Conference: yii@conference.jabber.ru
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение nickdenry »

@R3D3 Спасибо за предположение.

Данный код выдает:

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

Setting unknown property: yii\behaviors\TimestampBehavior::beforeInsert
НО

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

   /**
     * @inheritdoc
     */
    public function behaviors()
    {
        return [
            'timestamp' => [
                'class' => TimestampBehavior::className(),
                //ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                //ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
                'value' => new Expression('NOW()'),

            ],
        ];
    } 
это - работает.
Ответственные программисты с высоким уровнем технического долга (c)
nickdenry
Сообщения: 99
Зарегистрирован: 2015.10.28, 04:55

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение nickdenry »

@R3D3 Спасибо!

Соответсвенно, если указать attributes отдельно, а value отдельно - все работает.

Рабочий код -

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

    public function behaviors()
    {
        return [
            'timestamp' => [
                'class' => TimestampBehavior::className(),
                'attributes' => [
                    ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
                    ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
                ],
                'value' => new Expression('NOW()'),

            ],
        ];
    }
Скорее всего документация должна быть обновлена.
Ответственные программисты с высоким уровнем технического долга (c)
R3D3
Сообщения: 352
Зарегистрирован: 2010.04.11, 14:52

Re: TimestampBehavior возвращает timestamp при заданном Expression

Сообщение R3D3 »

Меня сбило с толку указание атрибутов, но если посмотреть внимательнее, то в документации все написано верно: ключ 'value' предлагается указывать вне массива 'attributes', а не внутри него. А название поведения 'timestamp' можно не указывать, поведения могут быть "анонимными".
Yii Jabber Conference: yii@conference.jabber.ru
Ответить