아래 Laravel 튜토리얼 칼럼에서는 Laravel 모델 타임스탬프를 사용하는 방법에 대한 8가지 팁을 공유합니다. 아직 사용해 본 적이 없다면 컬렉션에 추가해 보세요.
기본적으로 Laravel Eloquent
모델 기본 데이터 테이블에는 created_at
및 updated_at
라는 두 개의 필드가 있습니다. 물론, 우리는 많은 사용자 정의 구성을 만들고 많은 흥미로운 기능을 구현할 수 있습니다. 다음은 몇 가지 예입니다. Laravel Eloquent
模型默认数据表有 created_at
和 updated_at
两个字段。当然,我们可以做很多自定义配置,实现很多有趣的功能。下面举例说明。
如果数据表没有这两个字段,保存数据时 Model::create($arrayOfValues); ——会看到 SQL error
。Laravel
在自动填充 created_at / updated_at
的时候,无法找到这两个字段。
禁用自动填充时间戳,只需要在 Eloquent Model
添加上一个属性:
class Role extends Model { public $timestamps = FALSE; // ... 其他的属性和方法 }
假如当前使用的是非 Laravel
类型的数据库,也就是你的时间戳列的命名方式与此不同该怎么办? 也许,它们分别叫做 create_time 和 update_time。恭喜,你也可以在模型种这么定义:
class Role extends Model { const CREATED_AT = 'create_time'; const UPDATED_AT = 'update_time';
以下内容引用官网文档 official Laravel documentation:
默认情况下,时间戳自动格式为 'Y-m-d H:i:s'
。 如果您需要自定义时间戳格式, 可以在你的模型中设置 $dateFormat
属性。这个属性确定日期在数据库中的存储格式,以及在序列化成数组或JSON时的格式:
class Flight extends Model { /** * 日期时间的存储格式 * * @var string */ protected $dateFormat = 'U'; }
当在多对多的关联中,时间戳不会自动填充,例如 用户表 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(); }
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();
updated_at
的修改无论何时,当修改 Eloquent
记录,都将会自动使用当前时间戳来维护 updated_at 字段,这是个非常棒的特性。
但是有时候你却不想这么做,例如:当增加某个值,认为这不是 “整行更新”。
那么,你可以一切如上—— 只需禁用 timestamps
,记住这是临时的:
$user = User::find(1); $user->profile_views_count = 123; $user->timestamps = false; $user->save();
与上一个例子恰好相反,也许您需要仅更新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'); } }
Carbon
类最后一个技巧,但更像是一个提醒,因为您应该已经知道它。
默认情况下,created_at和updated_at字段被自动转换为$dates,
所以您不需要将他们转换为Carbon
实例,即可以使用Carbon
데이터 테이블에 이 두 필드가 없으면 데이터를 저장할 때 Model::create($arrayOfValues); 강함> ——SQL 오류
가 표시됩니다. Laravel
은 created_at /update_at
를 자동으로 채울 때 이 두 필드를 찾을 수 없습니다.
Eloquent Model
에 이전 속성을 추가하세요.
$user->created_at->addDays(3); now()->diffInDays($user->updated_at);
기본값 이 경우 타임스탬프는 자동으로Laravel
이 아닌 데이터베이스를 사용하고 있고 타임스탬프 열의 이름이 다르게 지정되어 있다면 어떻게 될까요? 아마도 각각 create_time 및 update_time이라고 불릴 것입니다. 축하합니다. 모델에서 다음과 같이 정의할 수도 있습니다:rrreee
3. 타임스탬프 날짜/시간 형식 수정
다음 내용은 공식 Laravel 문서를 참조합니다.
'Y-m-d H:i:s'
형식으로 지정됩니다. 타임스탬프 형식을 맞춤설정해야 하는 경우 모델에서 $dateFormat
속성을 설정할 수 있습니다. 이 속성은 날짜가 데이터베이스에 저장되는 형식과 배열 또는 JSON으로 직렬화되는 형식을 결정합니다: 🎜rrreee🎜Laravel
은 created_at/updated_at
🎜🎜을 자동으로 채우려고 시도하지 않습니다. 하지만 타임스탬프를 자동으로 저장하려면 created_at/updated_at
를 추가해야 합니다. > 마이그레이션 파일 코드>에 ->withTimestamps();🎜rrreee🎜latest()
및 oldest()
타임스탬프 정렬 수행updated_at
수정을 트리거하지 마세요. >Eloquent
레코드가 수정될 때마다 현재 타임스탬프가 자동으로 사용되어 updated_at 필드를 유지하는데 이는 훌륭한 기능입니다. 🎜🎜그러나 때로는 이 작업을 수행하고 싶지 않을 수도 있습니다. 예를 들어 특정 값을 추가할 때 이것이 "전체 행 업데이트"가 아니라고 생각합니다. 🎜🎜그런 다음 위와 같이 계속할 수 있습니다. 타임스탬프
를 비활성화하세요. 이는 일시적인 것임을 기억하세요. 🎜rrreee🎜updated_at
도 업데이트하려고 합니다. 🎜🎜그런 다음 모델에서 $touches
속성을 정의해야 합니다. 🎜rrreee🎜Carbon
으로 변환됩니다. class Carbon
메서드를 사용할 수 있습니다. 🎜🎜예: 🎜rrreee🎜🎜바로 그 것입니다. 빠르고 유용한 팁입니다! 🎜🎜🎜영어 원문 주소: https://laraveldaily.com/8-tricks-with-laravel-timestamps/🎜🎜번역 주소: https://learnku.com/laravel/t/39353🎜🎜위 내용은 [정리 및 공유] Laravel 모델 타임스탬프 사용을 위한 8가지 팁의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!