web-dev-qa-db-ja.com

Laravel更新時にcreated_atを変更します

私はこの件について この答え を見つけましたが、それは私にはうまくいきません。

そこで、データベースにエントリを作成します。

// 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フィールドは更新時に変更されます。

12
Skatch

Laravel 5.2を使用していてMySQLを使用している場合、タイムスタンプで導入された「バグ」が少しありました。githubでこの問題に関するすべてを読むことができます こちら =。これはタイムスタンプのデフォルトに関係しており、MySQLは特定の条件下でDEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性を自動的に割り当てます。

基本的に、3つのオプションがあります。

  1. MySQL変数を更新します。

_explicit_defaults_for_timestamp_変数をTRUEに設定すると、タイムスタンプ列にはDEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性が自動的に割り当てられません。変数 here について詳しく読むことができます。

  1. Null許容のタイムスタンプを使用します。

$table->timestamps()$table->nullableTimestamps()に変更します。デフォルトでは、$table->timestamps()コマンドはnullにできないタイムスタンプフィールドを作成します。 $table->nullableTimestamps()を使用すると、タイムスタンプフィールドがnull可能になり、MySQLは最初のフィールドにDEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性を自動的に割り当てません。

  1. タイムスタンプを自分で定義します。

_$table->timestamps_を使用する代わりに、$table->timestamp('updated_at'); $table->timestamp('created_at');を自分で使用します。 'updated_at'フィールドがテーブルの最初のタイムスタンプであることを確認してください。これにより、DEFAULT CURRENT_TIMESTAMPまたはON UPDATE CURRENT_TIMESTAMP属性が自動的に割り当てられます。

24
patricus

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')を実行してこの問題に対処できます。

(申し訳ありませんが、上のコメントを追加することはできませんでした-私の評判はまだ十分ではありません...)

3
sgrover

これをトップレベルの回答として投稿し、コメントディスカッションを要約します。

最初に、日付があります バグ 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');
    }
}
1
sgrover

これは、テーブルフィールド定義の問題である必要があります。最近同じ問題に直面し、テーブルを確認すると、created_atに「EXTRA」と値on update CURRENT_TIMESTAMPがあり、Laravel通常は、次のようなフィールド定義を更新するだけです。

ALTER TABLE table_name CHANGE created_at created_at timestamp NOT NULL default CURRENT_TIMESTAMP;
0
Khairul Imam