Laravel 通过 SQL 文件播种

Laravel seeding via SQL file

我正在尝试从播种机中的 .sql 文件中读取数据,以用一些数据填充 3-4 个表,DatabaseSeeder.php 看起来像这样

public function run() {
    $this->call([
        UsersTableSeeder::class,
        // Bunch of seeders using Eloquent
        SqlSeeder::class
    ]);
}

所有其他播种机执行,实际上,当我试图在 SqlSeeder.php 中抛出异常时,我能够停止播种。但是,SqlSeeder.php 不会通过 php artisan migrate:fresh --seed 为数据库播种,似乎它已被绕过。我总是需要 运行 php artisan db:seed --class SqlSeeder 之后,以使其成为数据库的种子。 SqlSeeder.php 看起来像这样

public function run() {
    $path = base_path().'/database/seeds/sql/data.sql';
    $sql = file_get_contents($path);
    DB::unprepared($sql);
}

这是为什么?

检查 sql 文件中的播种数据顺序是否正确。

例如,如果您有外键 category_id 引用 categories.id posts table 将在您使用此 sql 时没有任何错误地为空文件:

INSERT INTO posts (title, category_id) VALUES ('test', 1);
INSERT INTO categories (title) VALUES ('category');

您应该先为类别播种,然后才发帖。

我通过从试图通过 DB::unprepared() 执行的 .sql 文件中删除事务来解决我自己的问题。奇怪的是,事务在执行 php artisan migrate:refresh --seed 时完全失败,但如果我稍后通过 php artisan db:seed --class SqlSeeder 单独调用 SqlSeeder,它们就会工作。目前没有外键约束,并且选择 InnoDB 作为引擎,只是为了确定,但事务仍然会失败并根据命令工作。

我想这完全取决于 Illuminate\Database\Seeder::call 的工作方式和内部调用播种器 类 的方式,但我不确定。

对于Laravel 5,您在主种子文件中所要做的就是:

\DB::unprepared(\File::get(base_path('path/to/your/sql/file.sql')));