首页 > 解决方案 > Laravel 7 从 SQL 文件中填充突变

问题描述

我正在从头开始重写一个大项目。数据库类似,但表已重命名,字段已移动。

我想在我的 Laravel 7.4 项目中创建读取每个表的 MySQL 转储并将它们导入新数据库的命令。我不能只运行命令,因为一切都发生了变化。

有没有一种简单的方法来读取转储文件,这样每个插入命令都会给我一个包含旧数据库中该记录数据的数组,然后我可以根据需要修改该数组以使用它来填充我的模型?

我想避免必须逐行读取文件并使用正则表达式来减去我需要的内容。

标签: mysqllaravelimportlaravel-7

解决方案


我最终编写了一些正则表达式来逐行执行,最后,代码非常易于管理。不过,我需要为每个 SQL 文件编写自定义正则表达式字符串。

public function handle()
{
    $sql = file_get_contents('./database/old_sql/language.sql');

    preg_match_all('/\(.*\)[\,;]/', $sql, $lines);

    foreach (array_shift($lines) as $line) {
        preg_match('/^\((\d+)\, \'(.*)\', (\d+)\)[\,;]$/', $line, $values);

        $language = Language::updateOrCreate([
            'languages.id' => $values[1]
        ], [
            'id'        => $values[1],
            'name'      => $values[2],
            'parent_id' => $values[3],
        ]);
    }
}

如果有人有更好、更清洁的解决方案,我很乐意听到。


推荐阅读