Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗pplrPmEqTs 174 of 252 menu
◀ ▶

Метки времени в моделях 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.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить