如何在laravel中自动运行database / seeds文件夹中的所有播种机?

时间:2017-08-02 13:49:36

标签: laravel

而是将所有新的播种器文件逐个手动添加到DatabaseSeeder.php文件中,是否可以自动运行种子目录中的所有文件。这可能吗?

PS:当然(正如@DissidentRage所提到的)在这种情况下我们 考虑自动化此类流程可以使您的播种机独立并且也会造成很多麻烦。

2 个答案:

答案 0 :(得分:4)

我在那个问题中运行,发现这是一个简单的答案。

您可以轻松地使用scandir()将所有文件名放入数组中,然后使用foreach循环遍历它们。然后自动调用/运行它们。这样,每次创建(主要使用run())播种器时,您都不需要将新类添加到php artisan make:seeder SomeTableSeeder方法。

所以相反:

// 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 as $key => $file){
            if ($file !== 'DatabaseSeeder.php' && $file[0] !== "." ){
                $this->call( explode('.', $file)[0] );
            }
        }
    }

} 

PS:如果要从此自动运行过程中排除播种器文件,只需在文件名的开头添加一个点。

PS2 :如果您因任何原因想更改排除字符。只需在if表达式前加上你想要的排除字符(比如下划线字符前置&& $file[0] !== "_")。 不要更改$file[0] !== "."表达式,因为它扩展了scandir()方法。和..文件夹。

答案 1 :(得分:1)

这是我用来自动执行修订的DatabaseSeeder.php代码段,它允许您通过在类名前面添加数字版本来操纵顺序。

使用php artisan make:seeder创建种子后,您可以重命名种子文件

  • 发件人:<orginal-classname>.php
  • 收件人:####-<orginal-classname>.php
    • 版本号的大小无关紧要

不需要更改播种机的实际类名。

$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