Php 通过SQL文件进行Laravel种子设定
我试图从播种器中的.sql文件中读取数据,用一些数据填充3-4个表,DatabaseSeeder.php如下所示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 =
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语句来工作的!