将数量或其他参数传递给 Laravel 播种机

use*_*651 8 php laravel laravel-seeding

我想传递一个参数来定义我想在数据库播种期间创建多少条记录,而无需手动编辑工厂。

我尝试了不同的变体 php artisan db:seed --class=UsersTableSeeder [using different args here]

我似乎找不到任何文档,所以我不知道在功能上是否存在。这样的东西存在吗?

class UsersTableSeeder extends Seeder
{
    public $limit = null;

    public function __construct($limit = 1) {
        $this->limit = $limit;
    }

    public function run()
    {
      echo $this->limit;
    }
}
Run Code Online (Sandbox Code Playgroud)

okn*_*ate 21

您可以这样设置:

public function run($count = 1)
Run Code Online (Sandbox Code Playgroud)

然后你可以这样传递参数:

$this->call(ClientSeeder::class, false, ['count' => 500]);
Run Code Online (Sandbox Code Playgroud)


Moh*_*Ani 18

您可以在致电任何其他播种者之前询问该限制,使用

// DatabaseSeeder.php

$limit = $this->command->ask('Please enter the limit for creating something !!');
Run Code Online (Sandbox Code Playgroud)

然后您可以将该限制传递给“DatabaseSeeder”中的任何其他播种者,如下所示

//DatabaseSeeder.php

$this->call(AnyAdditionalSeeder::class, false, compact('limit'));
Run Code Online (Sandbox Code Playgroud)

然后在“AnyAdditionalSeeder”中,您可以添加参数并将其命名为 $limit 到 run() 方法,如下所示

public function run($limit)
{
   // you can access limit variable here
}
Run Code Online (Sandbox Code Playgroud)

然后当您运行该命令时,php artisan db:seed它会询问您限制:)

  • 等等,为什么这不是公认的答案? (2认同)

pat*_*cus 15

无法直接指定参数。

如果要通过命令行指定参数,可以使用环境变量。

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        $limit = env('SEEDER_LIMIT', 1);

        echo $this->limit;
    }
}
Run Code Online (Sandbox Code Playgroud)

像这样调用:

SEEDER_LIMIT=10 php artisan db:seed --class=UsersTableSeeder
Run Code Online (Sandbox Code Playgroud)

  • @TimLewis 在这种情况下,它使用从 shell 环境设置的环境变量,而不是从“.env”文件设置的环境变量。即使该值是在“.env”文件中定义的,shell 环境中定义的任何变量也优先,因此您可以覆盖“.env”中定义的值。不过,在缓存配置时必须小心。当配置被缓存时,`.env`文件不会被加载。这就是为什么强烈建议不要在配置文件之外使用“env()”函数。为了简单起见,我在这里使用它,因为播种器通常在不带缓存配置的开发环境中使用。 (2认同)

Ptr*_*Ton 8

据我所知,没有播种机参数之类的东西,但您可以自己实现。您可以创建一个新命令,该命令接受参数并使用这些附加参数以编程方式调用播种机。

像这样的事情应该可以解决问题:

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{

    public function run(int $limit)
    {
        echo $limit;
        // Seed some stuff
    }
}

Run Code Online (Sandbox Code Playgroud)
namespace App\Console\Commands;

use Illuminate\Console\Command;
use UsersTableSeeder;

class SeedCommand extends Command
{
    protected $signature = 'app:seed {limit}';

    public function handle(UsersTableSeeder $seeder)
    {
        $limit = $this->argument('limit');
        $seeder->run($limit);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我只是在写这篇评论,这可能应该是这样。虽然这是正确的,但它并不能完全回答问题。如果您提供一个示例(创建命令的语法、传递给命令的参数示例、生成播种器的新实例并进一步将参数传递给该实例,然后实际调用“run()”等) ,那么它就会回答这个问题,但这个问题也可能太宽泛了。 (2认同)