ホームページ  >  記事  >  PHPフレームワーク  >  Laravel モデルのタイムスタンプを使用するための 8 つのヒント

Laravel モデルのタイムスタンプを使用するための 8 つのヒント

藏色散人
藏色散人転載
2020-01-20 13:20:534141ブラウズ

デフォルトでは、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 チュートリアル 列をご覧ください。

以上がLaravel モデルのタイムスタンプを使用するための 8 つのヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。