Поделитесь 8 советами по использованию временных меток модели Laravel

PHP

Оригинальная ссылка:Learncool.com/la-Ravel/he/3…
Для обсуждения перейдите на профессиональный форум разработчиков Laravel:learnku.com/Laravel

Laravel

по умолчанию,Laravel EloquentТаблица данных модели по умолчанию имеетcreated_atа такжеupdated_atдва поля. Конечно, мы можем сделать много пользовательских настроек, чтобы реализовать множество интересных функций. Пример приведен ниже.


1. Отключить временные метки

Если в таблице данных нет этих двух полей, при сохранении данныхModel::create($arrayOfValues); --увидимSQL error.Laravelв автозаполненииcreated_at / updated_at, оба поля не найдены.

Чтобы отключить временные метки автозаполнения, простоEloquent ModelДобавьте предыдущее свойство:

class Role extends Model
{
    public $timestamps = FALSE;

    // ... 其他的属性和方法
}

2. Измените список меток времени по умолчанию.

Если вы в настоящее время используетеLaravelЧто делать, если тип базы данных, т. е. ваш столбец меток времени, назван иначе, чем это? Может быть, они называютсяcreate_timeа такжеupdate_time. Поздравляем, вы также можете определить это в модели:

class Role extends Model
{
    const CREATED_AT = 'create_time';
    const UPDATED_AT = 'update_time'; 


3. Измените формат даты/времени метки времени.

Следующее содержание относится к официальному документу веб-сайтаofficial Laravel documentation:

По умолчанию метки времени автоматически форматируются как'Y-m-d H:i:s'. Если вам нужен собственный формат метки времени, вы можете установить его в своей модели.$dateFormatАтрибуты. Это свойство определяет формат, в котором дата хранится в базе данных и при сериализации в массив или JSON:

class Flight extends Model
{
    /**
     * 日期时间的存储格式
     *
     * @var string
     */
    protected $dateFormat = 'U';
}

4. Многие ко многим: промежуточная таблица с меткой времени

Временные метки не заполняются автоматически в ассоциациях «многие ко многим», например в таблице пользователей.usersи лист ролейrolesпромежуточная таблицаrole_user.

В этой модели вы можете определить отношения следующим образом:

class User extends Model
{
    public function roles()
    {
        return $this->belongsToMany(Role::class);
    }
}

Затем, когда вы хотите добавить роль пользователю, вы можете использовать ее следующим образом:

$roleID = 1;
$user->roles()->attach($roleID);

По умолчанию эта промежуточная таблицаНе включает метку времени. а такжеLaravelне будет пытаться автозаполнятьcreated_at/updated_at

Но если вы хотите сохранить метку времени автоматически, вам нужно добавить в файл миграцииcreated_at/updated_at, а затем добавьте **->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 ascending

User::oldest()->get();

Конечно, вы также можете использовать указанные другие поля для сортировки. Например, если вы хотите использоватьupdated_at, ты можешь это сделать:

$lastUpdatedUser = User::latest('updated_at')->first();

6. Не срабатываетupdated_atМодификации

Всякий раз, при измененииEloquentзаписи, будут автоматически поддерживаться с текущей отметкой времениupdated_atполя, что является отличной функцией.

Но иногда вы не хотите этого делать, например: при увеличении значения думайте, что это не «обновление всей строки».

Ну можно сделать как выше - просто отключитьtimestamps, помните, что это временно:

$user = User::find(1);
$user->profile_views_count = 123;
$user->timestamps = false;
$user->save();

7. Обновить только отметку времени и связанную отметку времени

В отличие от предыдущего примера, возможно, вам нужно обновить толькоupdated_atполе без изменения других столбцов.

Поэтому не рекомендуется писать следующее:

$user->update(['updated_at' => now()]);

Вы можете использовать более быстрый метод:

$user->touch();

Другая ситуация, иногда хочется обновить не только текущую модельupdated_at, а также хотите обновить записи родительского отношения.

Например,commentобновляется, то вы хотитеpostстолupdated_atТакже обновлено.

Затем вам нужно определить в вашей модели$touchesАтрибуты:

class Comment extends Model {

    protected $touches = ['post'];

    public function post()
    {
        return $this->belongsTo('Post');
    }

}

8. Автоматическое преобразование полей меток времениCarbonДобрый

Последний совет, но скорее напоминание, потому что вы уже должны это знать.

по умолчанию,created_atа такжеupdated_atполя автоматически преобразуются в **$даты**, поэтому вам не нужно преобразовывать их вCarbonнапример, вы можете использоватьCarbonМетоды.

Например:

$user->created_at->addDays(3);
now()->diffInDays($user->updated_at);

Вот и все, быстрый, но, надеюсь, полезный совет!

Оригинальная ссылка:Learncool.com/la-Ravel/he/3…
Для обсуждения перейдите на профессиональный форум разработчиков Laravel:learnku.com/Laravel