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')));
我正在尝试从播种机中的 .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')));