Метки времени в моделях Eloquent в Laravel
В таблицах часто нужно знать,
когда строка появилась в базе
и когда её последний раз меняли.
Для этого служат служебные колонки
created_at и updated_at -
метки времени записи.
Они не заменяют бизнес-поля вроде
даты публикации поста или дня рождения
пользователя. created_at -
техническая отметка «когда строку
создали в этой таблице».
updated_at - «когда последний
раз сохраняли изменения через модель».
Удобно для отладки, сортировки
«сначала новые» и админок.
Колонки из миграции
Сами поля в таблицу добавляют
миграцией. В Laravel для этого
есть метод timestamps -
он создаёт обе колонки одной строкой.
Подробнее мы разбирали его
в разделе про
типы колонок.
Типичная миграция таблицы постов уже содержит эту строку в конце:
<?php
public function up(): void
{
Schema::create('posts', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('text');
$table->timestamps();
});
}
?>
После migrate в таблице
появятся created_at
и updated_at типа
TIMESTAMP. Значения
в них Eloquent подставляет сам -
вручную в контроллере писать
дату обычно не нужно.
При создании записи
При первом save новой модели
Laravel записывает текущее время
в оба поля: и created_at,
и updated_at.
Достаточно задать обычные поля -
метки времени не трогаем:
<?php
$post = new Post;
$post->title = 'title';
$post->text = 'text text text';
$post->save();
// created_at и updated_at заполнены автоматически
?>
Посмотреть значения можно через
dump сразу после сохранения:
<?php
dump($post->created_at);
dump($post->updated_at);
?>
При изменении записи
Если модель уже есть в базе,
save обновляет только
updated_at. Значение
created_at остаётся тем,
которое было при создании -
его Eloquent не перезаписывает.
<?php
$post = Post::find(1);
$post->title = 'new title';
$post->save();
// updated_at обновлён, created_at без изменений
?>
При удалении записи
При обычном delete строка
удаляется из таблицы целиком.
Вместе с ней исчезают и все поля,
включая created_at
и updated_at - Eloquent
их отдельно не меняет, просто
записи больше нет.
<?php
$post = Post::find(1);
$post->delete();
?>
Если включено
мягкое удаление,
строка в таблице остаётся.
Вместо физического удаления
заполняется отдельное поле
deleted_at - время,
когда запись «удалили».
created_at и updated_at
при этом сохраняются, как были.
Автозаполнение меток времени
работает, пока в модели включено
поведение по умолчанию
(свойство $timestamps
равно true). Если для
таблицы даты не нужны, колонки
не добавляют в миграцию
или отключают автоматику в модели.
Создайте пост через модель
и выведите created_at
и updated_at после
save.
Измените этот пост и снова
выведите обе метки.
Убедитесь, что изменился
только updated_at.