Laravelの雄弁なタイムスタンプを無効にする


186

現在、Webアプリケーションの1つをCodeIgniterからLaravelに変換しています。ただし、この時点ではすべてのテーブルにupdated_at/ created_atフィールドを追加する必要はありません。これは、これをすべてより詳細に行うロギングクラスがあるためです。

私は設定できることを知っています$timestamps = false;

Vendor\laravel\framework\src\illuminate\Datebase\Eloquent\Model.php

ただし、Laravelのコアファイルを変更したり、モデルの全員に一番上に配置したりするのは避けたいです。すべてのモデルで他の場所でこれを無効にする方法はありますか?

回答:


360

public $timestamps = false;すべてのモデルで宣言するか、BaseModelを作成してそこで定義し、すべてのモデルで雄弁ではなく拡張する必要があります。Eloquentを使用している場合、ピボットテーブルにはタイムスタンプが必要です。

更新:Laravel v3以降のピボットテーブルでは、タイムスタンプは必須ではなくなりました。

更新:$table->timestamps()移行から削除してタイムスタンプを無効にすることもできます。


1
BaseModelを実行してそこに設定することを考えなかった理由がわかりません。美しく動作します。ドキュメンテーションピボットテーブルによるメモは、withTimestamps()を今設定する場合にのみ必要です(これが以前のバージョンから変更されたかどうかはわかりません)
projectxmatt

withTimestamps()メソッドを認識していませんでした。調査する必要があります。
bgallagh3r 2013年

@ bgallagh3r、とにかくパーティキュラークエリに対してのみdiasbleするためのものはありますか。フォントエンドの表示ではタイムスタンプは必要ありませんが、バックエンドではタイムスタンプが必要だとしましょう。とにかくそうすることはありますか?
user7747472

10
移行から$ table-> timestamps()を削除しても、雄弁はそれらをクエリに含めます。フィールドが存在しないため、これはエラーになります。そうでなければ素晴らしい答え。
Thijs Steel

115

この行をモデルに配置するだけです。

public $timestamps = false;

以上です!


例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    public $timestamps = false;

    //
}

1つの操作(コントローラーなど)のタイムスタンプを無効にするには:

$post->content = 'Your content'; 
$post->timestamps = false; // Will not modify the timestamps on save
$post->save();

すべてのモデルのタイムスタンプを無効にするには、新しいBaseModelファイルを作成します。

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model
{
    public $timestamps = false;

    //
}

次にBaseModel、次のように、モデルをそれぞれで拡張します。

<?php

namespace App;

class Post extends BaseModel
{
    //
}

22

更新を無効にするだけでよい場合は、このメソッドをモデルに追加するだけです。

public function setUpdatedAtAttribute($value)
{
    // to Disable updated_at
}

これは、親のsetUpdatedAtAttribute()メソッドをオーバーライドします。created_atは通常どおり機能します。同じように、created_atのみの更新を無効にするメソッドを記述できます。


2
$ timestamps = falseを設定すると、created_at-> diffForHumans()メソッドがカーボンインスタンスではなくなったため機能しなくなったため、これは私にとってはうまくいきました。
Nivin 2017

それは私にとってはうまくいきます、この方法は私が必要とするupdated_atフィールドを無効にするだけです。おかげで
Radames E. Hernandez

22

5.5.xを使用している場合:

const UPDATED_AT = null;

そして 'created_at'フィールドには、次のように使用できます。

const CREATED_AT = null;

最新バージョンであることを確認してください。(これはLaravel 5.5.0で壊れ、5.5.5で再び修正されました)。


11

雄弁なモデル:

class User extends Model    
{      
    protected $table = 'users';

    public $timestamps = false;
}

または単にこれを試してください

$users = new Users();
$users->timestamps = false;
$users->name = 'John Doe';
$users->email = 'johndoe@example.com';
$users->save();

9

前述のように、既存のモデルからタイムスタンプを削除する場合は、これをモデルに配置します。

public $timestamps = false;

また、up()メソッドに次のコードを含むマイグレーションを作成して実行します。

Schema::table('your_model_table', function (Blueprint $table) {
    $table->dropTimestamps();
});

メソッドで使用$table->timestamps()してdown()、ロールバックを許可できます。


1
これが最良の答えです。既存の本番データベースがある場合は、移行を実行し、モデルのタイムスタンプを無効にする必要があります。
ブラッド

7

ただ宣言するpublicあなたにタイムスタンプ変数をModelするfalseとすべてが偉大な動作します。

public $timestamps = false;


5

次の行をモデルに追加します。

既存の変数$timestamps truefalseに上書き

/**
 * Indicates if the model should be timestamped.
 *
 * @var bool
 */

public $timestamps = false;

1

関数setUpdatedAt()getUpdatedAtColumn()モデルをオーバーライドする

public function setUpdatedAt($value)
{
   //Do-nothing
}

public function getUpdatedAtColumn()
{
    //Do-nothing
}

20
「動作しますが、正しい心の誰もこれを実際に実行することはありません」のケース
developerbmw

1

タイムスタンプを一時的に無効にすることができます

$timestamps = $user->timestamps;
$user->timestamps=false;   // avoid view updating the timestamp

$user->last_logged_in_at = now();
$user->save();

$user->timestamps=$timestamps;   // restore timestamps
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.