不是手动将所有新的seeders文件一个一个地添加到DatabaseSeeder.php文件中,是否可以自动运行seeds目录中的所有文件。PS:当然(正如@DissidentRage所提到的)在这种情况下,我们应该考虑自动化这些过程可以使你的播种者独立,也会造成很多麻烦。
13z8s7eq1#
我在那个问题中运行,并发现这种方式作为一个简单的答案。您可以轻松地使用scandir()将所有文件名放入数组中,然后使用foreach循环遍历它们。然后自动调用/运行它们。这样,您就不需要在每次创建(通常使用php artisan make:seeder SomeTableSeeder)种子时将新类添加到run()方法中。因此,取而代之:
php artisan make:seeder SomeTableSeeder
run()
// database/seeds/DatabaseSeeder.php class DatabaseSeeder extends Seeder { public function run() { $this->call(UsersTableSeeder::class); $this->call(AnotherTableSeeder::class); ... } }
只需用途:
// database/seeds/DatabaseSeeder.php class DatabaseSeeder extends Seeder { public function run(){ $files_arr = scandir( dirname(__FILE__) ); //store filenames into $files_array foreach ($files_arr as $key => $file){ if ($file !== 'DatabaseSeeder.php' && $file[0] !== "." ){ $this->call( explode('.', $file)[0] ); } } } }
**PS:**如果您想从此自动运行过程中排除seeder文件,只需在文件名的开头添加一个点即可。PS2:如果你想改变excluder字符dot,只要在if表达式前加上你想要的excluder字符(比如下划线字符前加上&& $file[0] !== "_")。不要改变$file[0] !== "."表达式,因为它扩展了scandir()方法.和..文件夹。
&& $file[0] !== "_"
$file[0] !== "."
5kgi1eie2#
Laravel 8有以下可用的方法(call),您可以在DatabaseSeeder.php中使用。
call
DatabaseSeeder.php
/** * Run the database seeders. * * @return void */ public function run() { $this->call([ UserSeeder::class, PostSeeder::class, CommentSeeder::class, ]); }
但是重申一下,像这样运行种子可能不是最好的方法。
nxowjjhe3#
这是我用来自动执行修订的DatabaseSeeder.php代码片段,它允许你通过在类名前面添加一个数字版本来操纵顺序。在使用php artisan make:seeder创建seeder之后,您可以重命名seed-file
php artisan make:seeder
<orginal-classname>.php
####-<orginal-classname>.php
不需要更改seeder的实际类名。
$seedFilePattern = '/([0-9]+)\-([a-z0-9_\-]+)\.php/i'; $files = scandir(dirname(__FILE__)); // Alphabetically sorted foreach ($files as $key => $file) { if (!in_array($file, ['.', '..', 'DatabaseSeeder.php', 'BaseSeeder.php'])) { if (preg_match($seedFilePattern, $file, $matches)) { [, $version, $class] = $matches; $this->call($class); } else { echo '[WARNING] The file "' . $file . '" does not match the seeding pattern "' . $seedFilePattern . '", rename it accordingly to seed it automagically' . PHP_EOL; } } }
给定项目的种子目录
0001-abcSeeder.php 0002-defSeeder.php 0003-ghiSeeder.php ... 0008-xyzSeeder.php BaseSeeder.php DatabaseSeeder.php
如果在开发过程中需要添加一些东西,只需增加该版本的大小即可:00021
0001-abcSeeder.php 0002-defSeeder.php 00021-ForgotSomethingSeeder.php 0003-ghiSeeder.php ... 0008-xyzSeeder.php BaseSeeder.php DatabaseSeeder.php
pexxcrt24#
最简单的一个-----------作为db:seed运行databaseSeeder,
class DatabaseSeeder extends Seeder { public function run() { if (env('APP_ENV') === 'testing') { // Testing Seeder $this->call([]); } elseif (env('APP_ENV') === 'local') { // Local Seeder [Dev] $this->call(array_merge($this->productionSeeder(), $this->devSeeder())); } else { // Production Seeder $this->call($this->productionSeeder()); } } protected function devSeeder() { return [ UserSeeder::class, anotherSeeder::class, ----- ----- ]; } protected function productionSeeder() { return [ UserSeeder::class, anotherSeeder::class, ----- ----- ]; } }
4条答案
按热度按时间13z8s7eq1#
我在那个问题中运行,并发现这种方式作为一个简单的答案。
您可以轻松地使用scandir()将所有文件名放入数组中,然后使用foreach循环遍历它们。然后自动调用/运行它们。这样,您就不需要在每次创建(通常使用
php artisan make:seeder SomeTableSeeder
)种子时将新类添加到run()
方法中。因此,取而代之:
只需用途:
**PS:**如果您想从此自动运行过程中排除seeder文件,只需在文件名的开头添加一个点即可。
PS2:如果你想改变excluder字符dot,只要在if表达式前加上你想要的excluder字符(比如下划线字符前加上
&& $file[0] !== "_"
)。不要改变$file[0] !== "."
表达式,因为它扩展了scandir()方法.和..文件夹。5kgi1eie2#
Laravel 8有以下可用的方法(
call
),您可以在DatabaseSeeder.php
中使用。但是重申一下,像这样运行种子可能不是最好的方法。
nxowjjhe3#
这是我用来自动执行修订的
DatabaseSeeder.php
代码片段,它允许你通过在类名前面添加一个数字版本来操纵顺序。在使用
php artisan make:seeder
创建seeder之后,您可以重命名seed-file<orginal-classname>.php
####-<orginal-classname>.php
不需要更改seeder的实际类名。
给定项目的种子目录
如果在开发过程中需要添加一些东西,只需增加该版本的大小即可:00021
pexxcrt24#
最简单的一个-----------作为db:seed运行databaseSeeder,