Php 通过SQL文件进行Laravel种子设定

Php 通过SQL文件进行Laravel种子设定,php,sql,laravel,seeding,Php,Sql,Laravel,Seeding,我试图从播种器中的.sql文件中读取数据,用一些数据填充3-4个表,DatabaseSeeder.php如下所示 public function run() { $this->call([ UsersTableSeeder::class, // Bunch of seeders using Eloquent SqlSeeder::class ]); } public function run() { $path =

我试图从播种器中的.sql文件中读取数据,用一些数据填充3-4个表,DatabaseSeeder.php如下所示

public function run() {
    $this->call([
        UsersTableSeeder::class,
        // Bunch of seeders using Eloquent
        SqlSeeder::class
    ]);
}
public function run() {
    $path = base_path().'/database/seeds/sql/data.sql';
    $sql = file_get_contents($path);
    DB::unprepared($sql);
}
所有其他种子程序都会执行,实际上,当试图在SqlSeeder.php中抛出异常时,我能够停止种子程序。但是,SqlSeeder.php不会通过
phpartisan migrate:fresh--seed对数据库进行种子设定,似乎它被绕过了。我总是需要在之后运行
php artisan db:seed--class sqlseed
,以便使其为数据库种子。php看起来像这样

public function run() {
    $this->call([
        UsersTableSeeder::class,
        // Bunch of seeders using Eloquent
        SqlSeeder::class
    ]);
}
public function run() {
    $path = base_path().'/database/seeds/sql/data.sql';
    $sql = file_get_contents($path);
    DB::unprepared($sql);
}

为什么会这样?

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

例如,如果有外键
category\u id
引用了
categories.id
posts
当您使用此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被选为引擎,但事务仍然会失败,并且根据命令工作


我想这一切都取决于
illighted\Database\Seeder::call
如何在内部工作并调用Seeder类,但我不确定。

对于Laravel 5,在主种子文件内部需要做的就是:


\DB::未准备(\File::get(基本路径('path/to/your/sql/File.sql'))

php-artisan-migrate:fresh--seed
dd(DB::unprepared($sql))的结果是什么之后,检查是否所有从sql生成种子的表都是空的?解决方案:将.sql文件封装到事务中。奇怪的是,在调用php artisan migrate:refresh--seed时,事务和DB::unprepared()并不协调,但在调用--classI时工作,我知道种子设定的顺序,事实上我已经处理好了。在无数次尝试之后,我发现DB::unprepared()和DB::statement()在从DatabaseSeeder.php中调用时无法承受事务,但如果通过DB:seed--class SqlSeeder.php调用,则在处理事务时工作得很好。不知道为什么,但它是通过从事务中删除INSERT INTO语句来工作的!