Web Analytics Made Easy - StatCounter
Главная Блог 8 трюков с метками времени Laravel

8 трюков с метками времени Laravel

8 трюков с метками времени Laravel

Введение

По умолчанию модели 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);

Ссылки

8 Tricks with Laravel Timestamps