timestamps()
メソッドを持つ移行があり、その後、このテーブルをシードするシードがあります。
Schema::create('mytable', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->timestamps();
});
シードは次のようになります。
DB::table('mytable')->insert([
[
'title' => 'My Awesome Title'
]
]);
すべてを使用して実行する場合:
php artisan migrate:refresh --seed
アイテムは挿入されますが、created_at
およびupdated_at
両方とも 0000-00-00 00:00:00
なぜ正しく設定されないのですか?
作成する列スキームは次のとおりです。
`created_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
`updated_at` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
これらのスキームが欲しい:
`created_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
Eloquentを使用しないでデータを挿入するときは、自分でタイムスタンプを挿入する必要があります。
使用する場合:
$x = new MyTable();
$x->title = 'My Awesome Title';
$x->save();
タイムスタンプが正しく入力されます(もちろん、最初にMyTable
モデルを作成する必要があります)
[〜#〜] edit [〜#〜]
本当に必要な場合は、変更できます。
$table->timestamps();
に:
$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
$table->timestamp('updated_at')->default(\DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
このテーブルのモデルを作成する場合は、設定する必要があります
$timestamps = false;
eloquentがそれらを設定しようとしていないことを確認します。
EDIT2
もう1つの重要な問題もあります。 PHPからのテーブルで日付を設定し、MySQLで他の日付を設定する場合は、PHPとMySQLの両方でまったく同じ日時が存在することを確認してください(または、レコードに設定したものと同じ日付比較を使用する必要があります(MySQLまたはPHPのいずれか)。
SELECT * FROM mytable WHERE DATE(created_at) = CURDATE()
PHP dateを渡してクエリを実行する場合とは異なる場合があります
"SELECT * FROM mytable WHERE DATE(created_at) = '".date('Y-m-d")."'"
なぜなら、PHPサーバーでは、たとえば2015-12-29かもしれませんが、MySQLサーバーでは2015-12-30
それ以降のバージョンでは、単に使用できます。 ( ソース )
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
タイムスタンプをシードし、それを工場で設定する場合、カーボンライブラリを使用します。そうでない場合は、次のようなことができます:
_$timestamps = false;
_
使用しない場合は、移行から$table->timestamps();
を削除します。