web-dev-qa-db-ja.com

Laravel 5移行でテーブルを更新してデータを追加する

laravel Project、これには問題ありません。更新するのにSchema::table()を使用しましたが、問題ありません。今度はいくつを調べる必要があります。このテーブルにあるレコードを更新し、何らかの値で更新します。

テーブルWarrantsがあります:

Schema::create('warrant_grants', function(Blueprint $table) {
    $table->increments('id');
    $table->integer('warrant_plan_id');
    $table->integer('shareholder_id');
});

そこで、新しい移行ファイルを使用して新しいフィールドを作成しました。

Schema::table('warrant_grants',function ($table) {
    $table->string('name',100);
});

次に、テーブル内のこのフィールドnameをいくつかの値で更新する必要があります。たとえば、テーブルに100レコードがある場合、すべての行に値「Warrant-X」を挿入する必要があります。 1から100まで。例:

Warrant-1、Warrant-2、.... Warrant-100。

私は種子を使用してこれを行うための方法を探すのに何時間も費やしましたが、見つかりませんでした。だから基本的に私は2つの質問があります:

  • Laravel 5でシードを使用して値を更新できますか、それとも単に挿入できますか?
  • この更新を行うために、シード(または移行)内にいくつかのSQLを作成できますか?
14
Deric Lima

このリンクに基づいて、私は答えを見つけました: https://stackoverflow.com/a/23506744/4650792

Schema::table('warrant_grants',function ($table){
        $table->string('name',100)->after('id')->nullable();
    });

    $results = DB::table('warrant_grants')->select('id','name')->get();

    $i = 1;
    foreach ($results as $result){
        DB::table('warrant_grants')
            ->where('id',$result->id)
            ->update([
                "name" => "Warrant-".$i
        ]);
        $i++;
    }

とにかく助けてくれてありがとう。

10
Deric Lima

はい、移行で更新/挿入などを実行できます。例えば:

Schema::table('warrant_grants', function($table) {
    $table->string('name', 100);
});

$i = 1;
foreach (WarrantGrants::all() as $warrant_grant) {
    $warrant_grant->update([
      'name' => 'Warrant-' . $i
    ]);

    $i++;
}
7

他の答えは正しいです。ただし、大量のレコードがある場合、それらすべてをORMで更新するには時間がかかることに注意してください。生のSQLクエリを使用して、それをより速く行います。

Schema::table('warrant_grants',function ($table){
        $table->string('name',100)->after('id')->nullable();
    });
DB::raw("UPDATE warrant_grants SET name=name+id");

SQLクエリは正確ではなく、独自のDB用に作成する必要がありますが、ポイントは得られます。

4
vfsoraki

これを実現するための別の可能な構文:

DB::table('warrant_grants')
   ->where('id',$result->id)
   ->update([
      "name" => DB::raw("'Warrant-' + `name`")
   ]);

これにより、結果を繰り返し処理するのではなく、1つのバッチとして更新を行うことができ、生のSQLを使用するだけではなく、おなじみのEloquent構文のほとんどを保持します。

使用するSQLバリアントに応じて、文字列連結構文を変更する必要がある場合があります。

1
rh16