16

メソッドを持つ移行があり、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,
4

3 に答える 3

39

Eloquent を使用せずにデータを挿入する場合は、自分でタイムスタンプを挿入する必要があります。

使用する場合:

$x = new MyTable();
$x->title = 'My Awesome Title';
$x->save();

タイムスタンプが正しく入力されます(もちろん、MyTable最初にモデルを作成する必要があります)

編集

本当に必要な場合は、次のように変更できます。

$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 日付を渡してクエリを実行する場合とは異なる場合があります

"SELECT * FROM mytable WHERE DATE(created_at) = '".date('Y-m-d")."'"

PHP サーバーでは 2015-12-29 のようになりますが、MySQL サーバーでは 2015-12-30 のようになります。

于 2015-12-29T17:31:38.470 に答える
1

タイムスタンプをシードして工場で設定する場合は、炭素ライブラリを使用します。そうでない場合は、次のようなことができます:

$timestamps = false;

$table->timestamps(); 使用しない場合は、移行から削除し ます。

于 2015-12-29T19:32:26.860 に答える