>  기사  >  PHP 프레임워크  >  [정리 및 공유] Laravel 모델 타임스탬프 사용을 위한 8가지 팁

[정리 및 공유] Laravel 모델 타임스탬프 사용을 위한 8가지 팁

青灯夜游
青灯夜游앞으로
2022-09-22 20:18:591684검색

아래 Laravel 튜토리얼 칼럼에서는 Laravel 모델 타임스탬프를 사용하는 방법에 대한 8가지 팁을 공유합니다. 아직 사용해 본 적이 없다면 컬렉션에 추가해 보세요.

[정리 및 공유] Laravel 모델 타임스탬프 사용을 위한 8가지 팁

기본적으로 Laravel Eloquent 모델 기본 데이터 테이블에는 created_atupdated_at라는 두 개의 필드가 있습니다. 물론, 우리는 많은 사용자 정의 구성을 만들고 많은 흥미로운 기능을 구현할 수 있습니다. 다음은 몇 가지 예입니다. Laravel Eloquent 模型默认数据表有 created_atupdated_at 两个字段。当然,我们可以做很多自定义配置,实现很多有趣的功能。下面举例说明。


1.禁用时间戳

如果数据表没有这两个字段,保存数据时 Model::create($arrayOfValues); ——会看到 SQL errorLaravel 在自动填充 created_at / updated_at 的时候,无法找到这两个字段。

禁用自动填充时间戳,只需要在 Eloquent Model 添加上一个属性:

class Role extends Model
{
    public $timestamps = FALSE;

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

2. 修改时间戳默认列表

假如当前使用的是非 Laravel 类型的数据库,也就是你的时间戳列的命名方式与此不同该怎么办? 也许,它们分别叫做 create_timeupdate_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_atupdated_at字段被自动转换为$dates
所以您不需要将他们转换为Carbon实例,即可以使用Carbon

1. 타임스탬프 비활성화

데이터 테이블에 이 두 필드가 없으면 데이터를 저장할 때 Model::create($arrayOfValues); 강함> ——SQL 오류가 표시됩니다. Laravelcreated_at /update_at를 자동으로 채울 때 이 두 필드를 찾을 수 없습니다.


타임스탬프 자동 채우기를 비활성화하고 Eloquent Model에 이전 속성을 추가하세요.

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

2. 타임스탬프 기본 목록 수정

Laravel이 아닌 데이터베이스를 사용하고 있고 타임스탬프 열의 이름이 다르게 지정되어 있다면 어떻게 될까요? 아마도 각각 create_timeupdate_time이라고 불릴 것입니다. 축하합니다. 모델에서 다음과 같이 정의할 수도 있습니다:

rrreee

3. 타임스탬프 날짜/시간 형식 수정

다음 내용은 공식 Laravel 문서를 참조합니다.

기본값 이 경우 타임스탬프는 자동으로 'Y-m-d H:i:s' 형식으로 지정됩니다. 타임스탬프 형식을 맞춤설정해야 하는 경우 모델에서 $dateFormat 속성을 ​​설정할 수 있습니다. 이 속성은 날짜가 데이터베이스에 저장되는 형식과 배열 또는 JSON으로 직렬화되는 형식을 결정합니다: 🎜rrreee🎜

4: 타임스탬프가 있는 중간 테이블 h3 >🎜다대다 연결에서는 사용자 테이블 users와 역할 테이블 사이의 중간 테이블 role_user와 같이 타임스탬프가 자동으로 채워지지 않습니다. 역할 >. 🎜🎜이 모델에서는 다음과 같이 관계를 정의할 수 있습니다: 🎜rrreee🎜 그런 다음 사용자에게 역할을 추가하려는 경우 다음과 같이 사용할 수 있습니다. 🎜rrreee🎜기본적으로 이 중간 테이블은 타임스탬프 . 그리고 Laravelcreated_at/updated_at🎜🎜을 자동으로 채우려고 시도하지 않습니다. 하지만 타임스탬프를 자동으로 저장하려면 created_at/updated_at를 추가해야 합니다. > 마이그레이션 파일 코드>에 ->withTimestamps();🎜rrreee🎜

5. latest()oldest()타임스탬프 정렬 수행

🎜타임스탬프 정렬을 사용하는 데는 두 가지 "단축 방법"이 있습니다. 🎜🎜대신: 🎜rrreee🎜이렇게 하는 것이 더 빠릅니다. 🎜rrreee🎜기본적으로 latest()created_at 정렬을 사용합니다. 🎜🎜따라서 oldest()가 있는데, 이는 created_at 오름차순🎜rrreee🎜물론, 지정된 다른 필드를 기준으로 정렬할 수도 있습니다. 예를 들어, updated_at을 사용하려면 다음과 같이 하면 됩니다. 🎜rrreee🎜

6 updated_at수정을 트리거하지 마세요. >

🎜 Eloquent 레코드가 수정될 때마다 현재 타임스탬프가 자동으로 사용되어 updated_at 필드를 유지하는데 이는 훌륭한 기능입니다. 🎜🎜그러나 때로는 이 작업을 수행하고 싶지 않을 수도 있습니다. 예를 들어 특정 값을 추가할 때 이것이 "전체 행 업데이트"가 아니라고 생각합니다. 🎜🎜그런 다음 위와 같이 계속할 수 있습니다. 타임스탬프를 비활성화하세요. 이는 일시적인 것임을 기억하세요. 🎜rrreee🎜

7 타임스탬프 및 관련 타임스탬프만 업데이트하세요 Strong>🎜이전 예와 달리 다른 열은 변경하지 않고 updated_at 필드만 업데이트해야 할 수도 있습니다. 🎜🎜따라서 다음 작성 방법은 권장되지 않습니다: 🎜rrreee🎜더 빠른 방법을 사용할 수 있습니다: 🎜rrreee🎜또 다른 상황에서는 때로는 현재 모델의 updated_at을 업데이트하고 싶을 뿐만 아니라, 또한 우수한 관계의 기록을 업데이트하고 싶습니다. 🎜🎜예를 들어 댓글이 업데이트되면 post 테이블의 updated_at도 업데이트하려고 합니다. 🎜🎜그런 다음 모델에서 $touches 속성을 ​​정의해야 합니다. 🎜rrreee🎜

8 타임스탬프 필드는 자동으로 Carbon으로 변환됩니다. class

🎜마지막 팁이지만, 이미 알고 있어야 하므로 상기시켜주는 것이 좋습니다. 🎜🎜기본적으로 created_atupdated_at 필드는 자동으로 $dates로 변환되므로 🎜이를 Carbon 인스턴스, 즉 Carbon 메서드를 사용할 수 있습니다. 🎜🎜예: 🎜rrreee🎜🎜바로 그 것입니다. 빠르고 유용한 팁입니다! 🎜🎜🎜영어 원문 주소: https://laraveldaily.com/8-tricks-with-laravel-timestamps/🎜🎜번역 주소: https://learnku.com/laravel/t/39353🎜🎜

위 내용은 [정리 및 공유] Laravel 모델 타임스탬프 사용을 위한 8가지 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제