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つの質問があります:
このリンクに基づいて、私は答えを見つけました: 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++;
}
とにかく助けてくれてありがとう。
はい、移行で更新/挿入などを実行できます。例えば:
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++;
}
他の答えは正しいです。ただし、大量のレコードがある場合、それらすべてを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用に作成する必要がありますが、ポイントは得られます。
これを実現するための別の可能な構文:
DB::table('warrant_grants')
->where('id',$result->id)
->update([
"name" => DB::raw("'Warrant-' + `name`")
]);
これにより、結果を繰り返し処理するのではなく、1つのバッチとして更新を行うことができ、生のSQLを使用するだけではなく、おなじみのEloquent構文のほとんどを保持します。
使用するSQLバリアントに応じて、文字列連結構文を変更する必要がある場合があります。