Laravel将变量从一个种子文件传递到另一个种子文件?

时间:2015-09-01 23:13:46

标签: php database laravel laravel-5

我创建了多个种子文件,我的主要DatabaseSeeder文件如下所示:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $name1 = "James";
        $name2 = "Jeff";
        $name3 = "Joe";

        $this->call(UserTableSeeder::class);
        $this->call(PersonTableSeeder::class);
        $this->call(IndividualTableSeeder::class);
        $this->call(HumanTableSeeder::class);
    }
}

如何使UserTableSeeder和PersonTableSeeder从我的主播种文件中获取变量? (我真正想做的是使用Faker输出随机值,但为每个表播种器使用相同的值)

3 个答案:

答案 0 :(得分:21)

我遇到了同样的问题,最后通过添加$ extra var并将其传递给run()函数来覆盖call()函数。

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $name1 = "James";
        $name2 = "Jeff";
        $name3 = "Joe";

        $this->call(UserTableSeeder::class, $name1);
        $this->call(PersonTableSeeder::class);
        $this->call(IndividualTableSeeder::class);
        $this->call(HumanTableSeeder::class);
    }

    public function call($class, $extra = null) {
        $this->resolve($class)->run($extra);

        if (isset($this->command)) {
            $this->command->getOutput()->writeln("<info>Seeded:</info> $class");
        }
    }

}

然后将$ extra添加到播种机类

// database/seeds/UserTableSeeder.php


  /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run($extra = null)
    {
        var_dump($extra);
    }
希望它有所帮助。

答案 1 :(得分:2)

As of laravel 8.2,您可以像这样将参数自然地传递给播种机

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $name1 = "James";

        $this->callWith(UserTableSeeder::class, ['name' => $name1]);
        $this->call(PersonTableSeeder::class);
        $this->call(IndividualTableSeeder::class);
        $this->call(HumanTableSeeder::class);
    }

}

class UserTableSeeder extends Seeder {
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run($name = null)
    {
        var_dump($name);
    }
}

答案 2 :(得分:-3)

也在寻找这个的任何人。接受的答案会起作用,但是为什么这么简单的事情变得过于复杂呢?

只需使用常量或全局变量即可。

DatabaseSeeder.php

define('SEEDING_SIZE', 10);

现在,在任何播种机中,该名称都将作为“ SEEDING_SIZE”提供。

不需要额外的功能。

https://www.php.net/manual/en/function.constant.php