web-dev-qa-db-ja.com

Laravel timestamps()はCURRENT_TIMESTAMPを作成しません

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,
12
Get Off My Lawn

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

26

それ以降のバージョンでは、単に使用できます。 ( ソース

$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->useCurrent();
2
bmatovu

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

_$timestamps = false;
_

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

0
Sari Yono