среда, 30 марта 2011 г.

Yii. Автоматическое заполнение полей created и modified

Если в Yii нужно в таблице создать поля для хранения даты/времени последней модификации и дату/время создания записи, удобно автоматизировать заполнение этих полей. В модель которая будет работать с данной таблицей, просто добавим фильтр перед записью в БД:

public function beforeSave() {
  if ($this->isNewRecord)
    $this->created = new CDbExpression('NOW()');
  $this->modified = new CDbExpression('NOW()');
  return parent::beforeSave();
}

6 комментариев:

  1. Есть один неприятный момент такого решения.
    Если создать модель, у которой прописано такое поведение, то после сохранения в поле $obModel->created будет NOW(), а не ваша дата.
    Т.е.
    name = 'somename';
    $obModel->save();
    echo $obModel->created; //NOW()

    ОтветитьУдалить
  2. поле created и предназначено для сохранения таймстампа создания записи, поле modified - время модификации соответственно. Немного не понял суть негативного момента..

    name = 'somename'; - к чему относится эта переменная?

    echo $obModel->created; - а что тут должно быть?

    ОтветитьУдалить
  3. возможно у вас просто неправильно указан тип поля в БД. Проверте вашу миграцию на создание таблицы, должно быть так:
    public function up(){

    $this->createTable('table', array(
    'id' => 'pk',
    ...
    'created' => 'timestamp without time zone',
    'updated' => 'timestamp without time zone',
    ));

    }

    ОтветитьУдалить
  4. Другой способ - использование behaviors (вставляем данный метод в модельку):

    public function behaviors()
    {
    return array(
    'CTimestampBehavior' => array(
    'class' => 'zii.behaviors.CTimestampBehavior',
    'createAttribute' => 'created',
    'updateAttribute' => 'modified',
    'setUpdateOnCreate' => true,
    'timestampExpression' => new CDbExpression('NOW()'),
    ),
    );
    }

    ОтветитьУдалить
  5. можно ли поведение прикрепить к контроллеру? т.е. параметры в поведения модели чтобы передавались в зависимости от контроллера

    ОтветитьУдалить