我需要在我的laravel项目中添加一个新列,没问题,我使用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”,其中X是a数字从1到100开始。
例如:
Warrant-1,Warrant-2,...... Warrant-100。
我花了几个小时寻找一些方法来使用种子做到这一点,但我没有找到。所以基本上我有两个问题:
答案 0 :(得分:9)
根据此链接,我找到了答案: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++;
}
无论如何,谢谢你的帮助。
答案 1 :(得分:7)
是的,您可以在迁移中执行更新/插入/任何操作。例如:
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++;
}
答案 2 :(得分:4)
其他答案都是正确的。但请注意,如果您有大量记录,使用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查询并不准确,你必须为你自己的数据库创建它,但你明白了。
答案 3 :(得分:0)
实现此目标的另一种语法:
DB::table('warrant_grants')
->where('id',$result->id)
->update([
"name" => DB::raw("'Warrant-' + `name`")
]);
这允许一次更新而不是遍历结果,并且保留了大多数熟悉的Eloquent语法,而不再只是使用原始SQL。
根据使用的SQL变体,可能需要更改字符串连接语法。