Использование поведения TimestampBehavior
В заключении, давайте посмотрим на [[yii\behaviors\TimestampBehavior]] — поведение, которое позволяет автоматически обновлять атрибуты с метками времени при сохранении [[yii\db\ActiveRecord|Active Record]] моделей через insert()
, update()
или save()
.
Для начала, необходимо прикрепить поведение к классу [[yii\db\ActiveRecord|Active Record]], в котором это необходимо:
namespace app\models\User;
use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;
class User extends ActiveRecord
{
// ...
public function behaviors()
{
return [
[
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at'],
],
// если вместо метки времени UNIX используется datetime:
// 'value' => new Expression('NOW()'),
],
];
}
}
Конфигурация выше описывает следующее:
- при вставке новой записи поведение должно присвоить текущую метку времени UNIX атрибутам
created_at
иupdated_at
; - при обновлении существующей записи поведение должно присвоить текущую метку времени UNIX атрибуту
updated_at
.
Note: Для того, чтобы приведённая выше конфигурация работала с MySQL, тип
created_at
иupdated_at
должен бытьint(11)
. В нём будет храниться UNIX timestamp.
Теперь, если сохранить объект User
, то в его атрибуты created_at
и updated_at
будут автоматически установлены значения метки времени UNIX на момент сохранения записи:
$user = new User;
$user->email = Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в вашем браузере должен быть включен Javascript.';
$user->save();
echo $user->created_at; // выведет метку времени на момент сохранения записи
Поведение [[yii\behaviors\TimestampBehavior|TimestampBehavior]] так же содержит полезный метод [[yii\behaviors\TimestampBehavior::touch()|touch()]], который устанавливает текущую метку времени указанному атрибуту и сохраняет его в базу данных:
$user->touch('login_time');