デフォルトでは、Laravel Eloquent モデルのデフォルト データ テーブルには、created_at と updated_at という 2 つのフィールドがあります。もちろん、多くのカスタム構成を作成し、多くの興味深い機能を実装することができます。以下に例を示します。
1. タイムスタンプを無効にする
データ テーブルにこれら 2 つのフィールドがない場合、データを保存するときに Model::create($arrayOfValues); が表示されます。 SQLエラー。 Laravel は、created_at / updated_at を自動的に埋めるときに、これら 2 つのフィールドを見つけることができません。
タイムスタンプの自動入力を無効にし、前の属性を Eloquent モデルに追加するだけです:
class Role extends Model { public $timestamps = FALSE; // ... 其他的属性和方法 }
2. タイムスタンプのデフォルトのリストを変更します
If Laravel 以外のデータベースを使用していて、タイムスタンプ列の名前が異なる場合はどうすればよいですか?おそらく、それらはそれぞれ create_time と update_time と呼ばれます。おめでとうございます。モデル内で次のように定義することもできます:
class Role extends Model { const CREATED_AT = 'create_time'; const UPDATED_AT = 'update_time';
3. タイムスタンプの日付/時刻形式を変更します
次の内容は、Laravel の公式ドキュメントを参照しています。 :
デフォルトでは、タイムスタンプは自動的に「Y-m-d H:i:s」としてフォーマットされます。カスタムのタイムスタンプ形式が必要な場合は、モデルで $dateFormat プロパティを設定できます。このプロパティは、日付がデータベースに格納される形式と、配列または JSON にシリアル化されるときの形式を決定します:
class Flight extends Model { /** * 日期时间的存储格式 * * @var string */ protected $dateFormat = 'U'; }
4. 多対多: タイムスタンプ付きの中間テーブル
多対多の関連付けの場合、ユーザー テーブル users とロール テーブル role の間の中間テーブル 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() を追加する必要があります。 association ;
public function roles() { return $this->belongsToMany(Role::class)->withTimestamps(); }
5. タイムスタンプの並べ替えには、latest() と Oldest() を使用します
タイムスタンプの並べ替えを使用するには、2 つの「ショートカット メソッド」があります。
代わりに:
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.Eloquent レコードが変更されるたびに、updated_at
の変更をトリガーしないでください。現在のタイムスタンプを使用して updated_at フィールドを自動的に維持します。これは優れた機能です。
しかし、これを実行したくない場合もあります。たとえば、特定の値を追加するとき、これは「行全体の更新」ではないと考えます。
したがって、上記と同じことを行うことができます - タイムスタンプを無効にするだけです。これは一時的なものであることに注意してください:
$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 は、上位関係の記録も更新したいと考えています。
たとえば、コメントが更新された場合、post テーブルの updated_at を更新するとします。
次に、モデルで $touches 属性を定義する必要があります:
class Comment extends Model { protected $touches = ['post']; public function post() { return $this->belongsTo('Post'); } }
8. タイムスタンプ フィールドは自動的に Carbon クラス
## に変換されます。 #最後のヒントですが、すでにご存知のはずなので、リマインダーのようなものです。 デフォルトでは、created_at フィールドと updated_at フィールドは自動的に $dates に変換されます。したがって、Carbon のメソッドを使用するためにそれらを Carbon インスタンスに変換する必要はありません。 例:$user->created_at->addDays(3); now()->diffInDays($user->updated_at);
laravel チュートリアル 列をご覧ください。
以上がLaravel モデルのタイムスタンプを使用するための 8 つのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。