我正在计划对我的数据库进行重大更改,这将需要一组 SQL 指令(可能还需要一个非 SQL 脚本)来将旧数据适应新架构。
现在,在迁移脚本上操作数据是个好主意吗?或者它只是为了架构(数据库结构)更改?
由于迁移的工作方式,数据操作不适合在迁移中执行。我建议仅使用迁移来定义数据库模式。
迁移被设计为在出现问题时能够“回滚”,而这通过数据操作是不可能实现的。
在 Laravel 中,迁移是按照它们创建的确切顺序按顺序执行的,允许 Laravel 跟踪它们的执行和顺序。这意味着您无法有选择地运行特定的类或文件。例如,您可能希望在部门表之前播种用户表,反之亦然,但迁移不提供这种灵活性。
对于数据操作,我建议使用播种器,因为它们允许您通过以下方式选择在任何时间点运行哪个类:
php artisan db:seed --class=ClassName
顾名思义,播种器用于填充数据库。
如果您要更改现有数据,而不是填充新表,或者要将旧数据迁移到新表,那么 Artisan 命令是更好的解决方案。
在考虑迁移时,有两个问题很重要。
原始查询有助于解决这两个问题。
$elements = DB::Select(DB::Raw('SELECT element_id FROM record GROUP BY element_id'));
foreach ($elements as $element)
{
DB::Statement('
INSERT INTO account (created_at, updated_at, name, element_id)
VALUES (NOW(), NOW(), "Migrated account", '. $element->element_id .')
');
}