在 Laravel 5 迁移中更新表并添加数据
Posted
技术标签:
【中文标题】在 Laravel 5 迁移中更新表并添加数据【英文标题】:Update table and add data in a Laravel 5 Migration 【发布时间】:2016-09-25 12:01:30 【问题描述】:我需要在我的 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 是一个数字开头1到100。
例如:
Warrant-1, Warrant-2, ....Warrant-100。
我花了几个小时寻找使用 Seeds 的方法,但没有找到。所以基本上我有两个问题:
我可以在 Laravel 5 中使用 Seeds 来更新值还是直接插入它们? 我可以在种子(或迁移)中创建一些 SQL 来为我执行此更新吗?【问题讨论】:
您可以在迁移中更新值。 【参考方案1】:根据这个链接我找到了答案:https://***.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++;
谢谢大家的帮助。
【讨论】:
【参考方案2】:其他答案是正确的。但请注意,如果您有很多记录,则使用 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 查询不准确,您必须为自己的数据库创建它,但您明白了。
【讨论】:
其实,要执行一条sql命令,正确的方法应该是DB::statement
而不是DB::raw
【参考方案3】:
是的,您可以在迁移中执行更新/插入/任何操作。例如:
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++;
【讨论】:
一般来说,在您的迁移中使用模型并不是一个好主意,因为该模型将来可能会发生变化。这可能会破坏您的迁移。查看 Deric Lima 关于如何在不使用 Laravel 模型的情况下使用低级查询的答案。【参考方案4】:实现此目的的另一种可能的语法:
DB::table('warrant_grants')
->where('id',$result->id)
->update([
"name" => DB::raw("'Warrant-' + `name`")
]);
这允许更新作为一个批次完成,而不是迭代结果,并保留大部分熟悉的 Eloquent 语法,而不是回退到仅使用原始 SQL。
可能需要根据使用的 SQL 变体更改字符串连接语法。
【讨论】:
以上是关于在 Laravel 5 迁移中更新表并添加数据的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 5.1 中添加带有迁移的列后,无法在我的数据库中修改“updated_at”
Laravel 5.2 迁移:无法添加 char 数据类型的外键
laravel 5 迁移向我的数据库表添加了一些主键。怎样防止形成呢?