私はこの件について この答え を見つけましたが、それは私にはうまくいきません。
そこで、データベースにエントリを作成します。
// Write lead to database
$lead = Lead::create($lead_data);
そして、タイムスタンプは次のようになります。
| 2016-01-08 10:34:15 | 2016-01-08 10:34:15 |
しかし、次に外部サーバーにリクエストを出し、行を更新する必要があります。
$lead->user_id = $response['user_id'];
$lead->broker_id = $response['broker_id'];
$lead->save();
created_atフィールドが変更されます:
| 2016-01-08 04:34:17 | 2016-01-08 10:34:17 |
この問題を解決するにはどうすればよいですか?
[〜#〜]編集[〜#〜]
列を削除したり、移行をリセットしたりせずに、動作を変更するだけのソリューションが必要です。修正は、データに触れずにライブデータベースで実行する必要があります。以下に示すように、次の移行を試みました。
$table->datetime('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->change();
しかし、何も起こりません。 created_atフィールドは更新時に変更されます。
Laravel 5.2を使用していてMySQLを使用している場合、タイムスタンプで導入された「バグ」が少しありました。githubでこの問題に関するすべてを読むことができます こちら =。これはタイムスタンプのデフォルトに関係しており、MySQLは特定の条件下でDEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性を自動的に割り当てます。
基本的に、3つのオプションがあります。
_explicit_defaults_for_timestamp
_変数をTRUE
に設定すると、タイムスタンプ列にはDEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性が自動的に割り当てられません。変数 here について詳しく読むことができます。
$table->timestamps()
を$table->nullableTimestamps()
に変更します。デフォルトでは、$table->timestamps()
コマンドはnullにできないタイムスタンプフィールドを作成します。 $table->nullableTimestamps()
を使用すると、タイムスタンプフィールドがnull可能になり、MySQLは最初のフィールドにDEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性を自動的に割り当てません。
_$table->timestamps
_を使用する代わりに、$table->timestamp('updated_at'); $table->timestamp('created_at');
を自分で使用します。 'updated_at'フィールドがテーブルの最初のタイムスタンプであることを確認してください。これにより、DEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性が自動的に割り当てられます。
Skatch-上記のソリューションは適切ではないと思いますが、この場合は問題ありません。
問題は、PHPの日付であり、デフォルトのデフォルトのMYSQLタイムスタンプではないことです。その移行を実行すると、次のようなステートメントになります:
alter table alter column created_at default '2016:02:01 12:00:00';
日付の文字列に注意してください。移行を実行すると、レコードが数日後に追加されたときの現在の日付ではなく、その日付が常にcreated_atに使用されます。
「date( 'Y:m:d H:i:s')」の代わりに、DB :: raw( 'current_timestamp')を実行してこの問題に対処できます。
(申し訳ありませんが、上のコメントを追加することはできませんでした-私の評判はまだ十分ではありません...)
これをトップレベルの回答として投稿し、コメントディスカッションを要約します。
最初に、日付があります バグ Laravel-@patricusで指摘されているように導入されています。バグディスカッションで提案されている解決策は、単にnullableTimestamps() timestamps()、またはcreated_atおよびupdated_atフィールドを直接作成する場合-$table->timestamp('updated_at')->change()
。
これは未加工のSQLでも修正できます。これに似たALTERステートメント
alter table loader_rawvalues MODIFY column updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
これは既存のDBテーブルに直接適用できます(最初にテストするか、もちろんです!)。 OR DB :: unprepared()を使用して、マイグレーションから適用できます-例:
class CreateMyTable extends Migration
{
public function up()
{
Schema::create('mytable', function (Blueprint $table) {
$table->bigIncrements('id');
// ...
$table->timestamps();
});
DB::unprepared('alter table mytable MODIFY column updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP');
}
}
これは、テーブルフィールド定義の問題である必要があります。最近同じ問題に直面し、テーブルを確認すると、created_at
に「EXTRA
」と値on update CURRENT_TIMESTAMP
があり、Laravel通常は、次のようなフィールド定義を更新するだけです。
ALTER TABLE table_name CHANGE created_at created_at timestamp NOT NULL default CURRENT_TIMESTAMP;