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

1cosmwyk  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(212)

不是手动将所有新的seeders文件一个一个地添加到DatabaseSeeder.php文件中,是否可以自动运行seeds目录中的所有文件。
PS:当然(正如@DissidentRage所提到的)在这种情况下,我们应该考虑自动化这些过程可以使你的播种者独立,也会造成很多麻烦。

13z8s7eq

13z8s7eq1#

我在那个问题中运行,并发现这种方式作为一个简单的答案。
您可以轻松地使用scandir()将所有文件名放入数组中,然后使用foreach循环遍历它们。然后自动调用/运行它们。这样,您就不需要在每次创建(通常使用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()方法.和..文件夹。

5kgi1eie

5kgi1eie2#

Laravel 8有以下可用的方法(call),您可以在DatabaseSeeder.php中使用。

/**
 * Run the database seeders.
 *
 * @return void
 */
public function run()
{
    $this->call([
        UserSeeder::class,
        PostSeeder::class,
        CommentSeeder::class,
    ]);
}

但是重申一下,像这样运行种子可能不是最好的方法。

nxowjjhe

nxowjjhe3#

这是我用来自动执行修订的DatabaseSeeder.php代码片段,它允许你通过在类名前面添加一个数字版本来操纵顺序。
在使用php artisan make:seeder创建seeder之后,您可以重命名seed-file

  • 出发地:<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
pexxcrt2

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,
            -----
            -----
        ];
    }
}

相关问题