【问题标题】:Data migration from old table into new table, with Laravel 4使用 Laravel 4 将数据从旧表迁移到新表
【发布时间】:2013-12-26 09:39:09
【问题描述】:
是否可以将数据从旧表复制到新表而不是rename?我们正在计划一次重大的数据库架构升级,并希望保留当前的数据表,因此迁移down() 可以像删除新创建的表一样简单。
我们意识到这破坏了向后兼容性,因为migrate:rollback 并没有真正将任何新数据回滚到以前的状态;但是由于架构更新的规模,启用这样的事情将非常昂贵,只要它保留旧表,我们就满足于简单的单向迁移。
这可以单独在 Laravel 的迁移和架构中完成吗?
【问题讨论】:
标签:
php
laravel
migration
laravel-4
database-migration
【解决方案1】:
感谢@TonyArra 和@Fractaliste 的建议,我们现在执行以下操作,这使我们能够测试运行迁移和回滚,而不必担心数据丢失。
use Illuminate\Database\Migrations\Migration;
use MyNewModel;
class DataConvert extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
foreach(MyOldModel::all() as $item)
{
MyNewModel::create(array(...));
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
MyNewModel::truncate();
}
}
【解决方案2】:
据我所知,Laravel 中没有复制功能可以做到这一点,但使用模型相当容易。例如,如果您想将数据从表 users 移动到 newusers,您可以在 NewusersTableSeeder 运行函数中添加以下内容:
$users = User::all()->toArray();
foreach ($users as $user) {
$user['newField'] = "data";
Newuser::create($user);
}
(建议在播种器中完成,因为您应该已经在 DatabaseSeeder.php 中拥有Eloquent::unguard();)
【解决方案3】:
进入down() 函数并在删除表之前,我认为您可以执行数据导出。
迁移的基本用途是创建/删除表。但是没有什么能阻止你做一个更复杂的。工匠工具提供对任何 Laravel 功能的访问(我认为除了网络的 Input 或 Cookies)