Блог → Yii: автоматическая простановка времени создания и обновления модели AR

Одной из наиболее часто встречающихся задач, при работе с моделями Active Record, является сохранение времени ее создания и обновления. Многие для этих целей используют метод beforeSave(), но в Yii существует более удобный и простой способ. Это поведение CTimestampBehavior. Пользоваться им довольно просто. Достаточно в классе модели написать что-то типа этого:


public function behaviors(){
	return array(
		'CTimestampBehavior' => array(
			'class' => 'zii.behaviors.CTimestampBehavior',
			'createAttribute' => 'create_time',
			'updateAttribute' => 'update_time',
		)
	);
}	

По умолчанию время сохраняется в формате Unix Timestamp, поэтому поля в базе данных должны иметь соответствующий тип.

При создании новой записи значение поля update_time установиться в 0, что на самом деле неверно, ведь нулю соответствует конкретная дата (1 января 1970 года). Правильно хранить в этом поле NULL. Для этого в правила валидации модели нужно добавить:


array('create_time, update_time', 'default', 'setOnEmpty'=>true, 'value'=>null)

Еще мы можем внести небольшие изменения в CGridView, чтобы он показывал время в удобном нам формате:


$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'people-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		'id',
		'name',
		'surname',
		array(
			'name'=>'create_time',
			'value' => '$data->create_time!==null ? Yii::app()->dateFormatter->format("d MMM y", $data->create_time) : ""',
		),
		array(
			'name'=>'update_time',
			'value' => '$data->update_time!==null ? Yii::app()->dateFormatter->format("d MMM y", $data->update_time) : ""',
		),
		array(
			'class'=>'CButtonColumn', 
		),
	),
));

На этом пожалуй все. Удачи!


Комментарии (3)

Ramil
А если у мня поля времени DATETIME ?
Ответить
ElisDN
DATETIME тоже хорошо работает, так как CTimestampBehavior подставляет не число, а SQL выражение NOW(). При переконвертации можно приводить к UNIX формату функцией strtotime(). echo date('d.M.Y', strtotime($model->date)). Кстати, так как здесь затронуты поведения, то советую познакомиться с ними в нюансах в статье http://www.elisdn.ru/blog/41/usage-of-behaviors-in-yii
Ответить
Yiigenius
Небольшая неточность Вместо этого: "При создании новой записи значение поля update_time установиться в 0, что на самом деле неверно, ведь нулю соответствует конкретная дата (1 января 1970 года). Правильно хранить в этом поле NULL. Для этого в правила валидации модели нужно добавить: 1 array('create_time, update_time', 'default', 'setOnEmpty'=>true, 'value'=>null)" Нужно это: (просто 'setUpdateOnCreate' => true, ) public function behaviors(){ return array( 'LuboePorizvolnoeUnikalnoeNazvanie' => array( 'class' => 'zii.behaviors.CTimestampBehavior', 'createAttribute' => 'tc',//'time_create' 'updateAttribute' => 'tu',//'time_update' 'setUpdateOnCreate' => true, ) ); }
Ответить


Оставить свой комментарий


Представтесь, пожалуйста *

Ваш комментарий

Число на картинке *

captcha

На хостинг