【问题标题】:Passing a quantity or other arguments to a Laravel seeder将数量或其他参数传递给 Laravel 播种机
【发布时间】:2020-03-23 10:17:59
【问题描述】:

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

我在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;
    }
}

【问题讨论】:

    标签: php laravel laravel-seeding


    【解决方案1】:

    无法直接指定参数。

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

    class UsersTableSeeder extends Seeder
    {
        public function run()
        {
            $limit = env('SEEDER_LIMIT', 1);
    
            echo $this->limit;
        }
    }
    

    这样调用:

    SEEDER_LIMIT=10 php artisan db:seed --class=UsersTableSeeder
    

    【讨论】:

    • @TimLewis 在这种情况下,它使用从 shell 环境设置的环境变量,而不是来自 .env 文件。即使该值是在.env 文件中定义的,shell 环境中定义的任何变量都具有优先权,因此您可以覆盖.env 中定义的值。但是,当您缓存配置时,您必须小心。缓存配置时,不会加载 .env 文件。这就是为什么强烈建议不要在配置文件之外使用 env() 函数的原因。我在这里使用它是为了简单起见,因为播种机通常用于没有缓存配置的开发环境中。
    • @TimLewis 还因为默认值是硬编码在代码中的(未在 .env 文件中设置),并且因为对默认值的任何更改都需要在shell,无论缓存配置如何,env() 函数都会读取它。
    • 是的,当然,完全同意一切,我只是没有意识到你可以像这样通过命令行设置瞬态env(我猜不是.env)变量。似乎对像这样的 1-off 非常有用。为信息干杯!
    • @TimLewis 没问题。很高兴我能帮助你。 :)
    【解决方案2】:

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

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

    use Illuminate\Database\Seeder;
    
    class UsersTableSeeder extends Seeder
    {
    
        public function run(int $limit)
        {
            echo $limit;
            // Seed some stuff
        }
    }
    
    
    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() 等),那么它会回答它,但这个问题也可能过于宽泛。
    • 嗨蒂姆,我喜欢我们都想出了相同的答案。我没有时间将其放入实际的代码示例中。随意使用代码添加您自己的答案。所以我们可以将其标记为已接受
    • 仅此而已,我也没有时间;它的代码比我想写的要多,这是关闭为“太宽泛”的理由(即答案需要太多信息才能被视为简洁的答案)。我认为将其作为“答案”并没有什么坏处,但它可能会被否决/标记;很难说。
    • 你知道吗,我稍后会添加一个示例;)
    • 这是什么,这看起来不像是答案
    【解决方案3】:

    你可以这样设置:

    public function run($count = 1)
    

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

    $this->call(ClientSeeder::class, false, ['count' => 500]);
    

    【讨论】:

      【解决方案4】:

      您可以在调用任何其他播种机之前要求该限制

      // DatabaseSeeder.php
      
      $limit = $this->command->ask('Please enter the limit for creating something !!');
      

      然后您可以像这样将该限制传递给“DatabaseSeeder”中的任何其他播种机

      //DatabaseSeeder.php
      
      $this->call(AnyAdditionalSeeder::class, false, compact('limit'));
      

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

      public function run($limit)
      {
         // you can access limit variable here
      }
      

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

      【讨论】:

        【解决方案5】:

        我的解决方案:

        // MemberSeeder.php (example for Members Table)
        
        namespace Database\Seeders;
        
        use Illuminate\Database\Seeder;
        use App\Models\Member as ModelsMember;
        
        class MemberSeeder extends Seeder
        {
            /**
             * Run the database seeds.
             *
             * @return void
             */
            static function run(int $nRec=1) {
                ModelsMember::factory()->times($nRec)->create();
            }
        }
        

        从 .php 文件调用

        // Members.php
        namespace App\Http\Livewire;
        
        use Livewire\Component;
        use App\Models\Member;
        use Database\Seeders\MemberSeeder;
        
        class Members extends Component
        {
            public $members, $name, $email, $phone_number, $status, $member_id;
            public $bldModal = '';
            ...
            ...
            public function generaRecords() {
                MemberSeeder::run(2);
            }
        }
        

        用于创建表的架构

                Schema::create('members', function (Blueprint $table) {
                    $table->id();
                    $table->string('name');
                    $table->string('email')->unique();
                    $table->string('phone_number');
                    $table->char('status',1);
                    $table->timestamps();
                });
        

        短:改变

        public function run() {
        

        static function run(int $nRec=1) {
        

        【讨论】:

          猜你喜欢
          • 2021-07-11
          • 1970-01-01
          • 2018-03-30
          • 2020-01-29
          • 1970-01-01
          • 2021-03-03
          • 1970-01-01
          • 2011-11-01
          • 1970-01-01
          相关资源
          最近更新 更多