是否可以将旧表中的数据复制到新表而不是rename
?我们正计划进行主要的数据库模式升级,并希望保留当前的数据表,因此迁移down()
可以像删除新创建的表一样简单。
我们意识到这打破了向后兼容性,因为migrate:rollback
并没有真正将任何新数据回滚到以前的状态;但由于模式更新的规模,启用此类功能将非常昂贵,我们满足于简单的单向迁移,只要它保留旧表。
这可以在Laravel的迁移和架构中完成吗?
答案 0 :(得分:7)
感谢@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();
}
}
答案 1 :(得分:2)
据我所知,Laravel中没有复制功能可以做到这一点,但是对于模型来说这很容易。例如,如果要将数据从表用户移动到新用户,可以将以下内容添加到NewusersTableSeeder运行函数中:
$users = User::all()->toArray();
foreach ($users as $user) {
$user['newField'] = "data";
Newuser::create($user);
}
(建议在播种机中完成此操作,因为您在DatabaseSeeder.php中已经有Eloquent::unguard();
)
答案 2 :(得分:1)
进入down()
函数,在放弃表之前,我认为您可以执行数据导出。
迁移的基本用途是创建/删除表。但没有什么可以阻止你做一个更复杂的。而且工匠工具可以访问任何Laravel的功能(除了我认为的输入或Cookies之类的网络之外)
答案 3 :(得分:0)
不确定它是否有帮助,但我编写了一个小类,可帮助根据您在xml文件中提供的规则在两个具有完全不同结构的数据库之间复制数据,请参阅https://github.com/Binternet/redb 所以也许你可以在完成上次迁移时解决这个问题