
Введение
По умолчанию модели Laravel Eloquent предполагают, что ваша таблица имеет поля отметок времени - created_at
и updated_at
. Но вы можете многое сделать, чтобы настроить их или выполнить некоторые интересные операции. Давайте взглянем.
1. Отключить отметки времени
Если в вашей таблице БД нет этих полей, и вы попытаетесь сделать что-то вроде Model :: create ($ arrayOfValues);
- вы получите ошибку SQL. Laravel попытается автоматически заполнить created_at / updated_at
и не находит их. Чтобы отключить автоматические метки времени, в вашей модели Eloquent вам нужно добавить одно свойство:
class Role extends Model
{
public $timestamps = FALSE;
// ... other model properties and methods
}
2. Изменить имена столбцов с отметками времени
Что делать, если вы работаете с базой данных, отличной от Laravel, и ваши столбцы временных меток названы по-другому? Возможно, у вас есть create_time
и update_time
. К счастью, вы также можете указать их в модели:
class Role extends Model
{
const CREATED_AT = 'create_time';
const UPDATED_AT = 'update_time';
}
3. Изменить формат даты / времени метки времени
Здесь я просто процитирую официальную документацию Laravel: До Laravel 7 даты формировались в следующем формате: 2019-12-02 20:01:00
. Начиная с Laravel 7 даты, формировались с использованием нового формата и выглядят так: 2019-12-02T20: 01: 00.283041Z
. Если вам нужно настроить формат метки времени, установите свойство $dateFormat
в своей модели. Это свойство определяет, как атрибуты даты хранятся в базе данных, а также их формат при сериализации модели в массив или JSON:
class Flight extends Model
{
/**
* The storage format of the model's date columns.
*
* @var string
*/
protected $dateFormat = 'U';
}
4. Многие-ко-многим: сводная таблица с отметками времени
Небольшое исключение для автоматизации временных меток - создание сводной таблицы в отношениях «многие ко многим», например, таблица role_user
между users
и таблицами roles
. В модели вы должны определить отношения следующим образом:
class User extends Model
{
public function roles()
{
return $this->belongsToMany(Role::class);
}
}
А затем, когда вы хотите добавить роль пользователю, вы должны сделать что-то вроде этого:
$roleID = 1;
$user->roles()->attach($roleID);
По умолчанию эти сводные таблицы не содержат отметок времени. И в этом случае Laravel не пытается заполнить created_at / updated_at
.
But if you do want to save the timestamps automatically, you need to add them into migration file, and then define relationship using ->withTimestamps();
.
public function roles()
{
return $this->belongsToMany(Role::class)->withTimestamps();
}
5. Упорядочить по метке времени с latest()
и oldest()
Есть два «ярлыка» для упорядочивания данных по отметкам времени.
Вместо:
User::orderBy('created_at', 'desc')->get();
Вы можете сделать это быстрее:
User::latest()->get();
По умолчанию, latest()
будет упорядочен по created_at
. Существует противоположный метод oldest ()
, который упорядочивает по created_at
.
User::oldest()->get();
Кроме того, вы можете указать другой столбец для сортировки. Например, если вы хотите использовать updated_at
, вы можете сделать это:
$lastUpdatedUser = User::newest('updated_at')->first();
6. Обновление без прикосновения к updated_at
Всякий раз, когда вы обновляете запись Eloquent, она автоматически сохраняет текущую метку времени в столбце updated_at
, и это отличная функция.
Но иногда вы хотите этого избежать, например, увеличиваете какое-то значение и не хотите рассматривать это как «полное обновление записи».
Затем вам нужно сделать то же самое, что и выше - отключить временные метки, но только на этот раз:
$user = User::find(1);
$user->profile_views_count = 123;
$user->timestamps = false;
$user->save();
7. Touch and Parent Touch
Напротив последнего примера - возможно, вы хотите установить новое значение ТОЛЬКО в столбце updated_at
, а не изменять другие. Итак, вместо:
$user->update(['updated_at' => now()]);
You can use a shorter method:
$user->touch();
Другой случай - иногда вы хотите установить не только updated_at
текущей модели Eloquent, но и ее родительскую запись по отношению.
Например, если какой-то комментарий был обновлен, вы хотите учитывать, что эта запись сообщения также должна иметь новый updated_at
.
Затем вам нужно определить модели «родительских прикосновений» в модели Eloquent:
class Comment extends Model {
protected $touches = ['post'];
public function post()
{
return $this->belongsTo('Post');
}
}
8. Timestamp Fields are Carbon Automatically
Последний «бонусный» совет - больше похоже на «напоминание», потому что вы должны об этом знать.
По умолчанию и created_at
, и updated_at
приводятся как ``$dates``` модели Eloquent, поэтому вы можете выполнять над ними операции Carbon без преобразования в экземпляр Carbon.
Пример
$user->created_at->addDays(3);
now()->diffInDays($user->updated_at);