Laravel将变量从一个种子文件传递到另一个?
Posted
技术标签:
【中文标题】Laravel将变量从一个种子文件传递到另一个?【英文标题】:Laravel passing variables from one seed file to another? 【发布时间】:2015-11-27 07:41:22 【问题描述】:我创建了多个种子文件,我的主 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 输出随机值,但对每个表播种器使用相同的值)
【问题讨论】:
当您到达PersonTableSeeder
时,您将迭代用户并为每个用户创建一个人。这意味着您只需要在PersonTableSeeder
中生成名称。
对于我想要做的事情,我需要一些列来匹配其他表中的相同值,这就是我在类之外设置变量的原因。例如,我将生成一个随机数,并且我想将相同的数字传递给 UserTableSeeder
和 PersonTableSeeder
。
你必须为一个用户创建一个人,这个用户会有随机数。
我不确定我理解你的意思抱歉。可以举个例子吗?
也许看看在 Faker 中播种随机数生成器(与为数据库播种不同):github.com/fzaninotto/Faker#seeding-the-generator。使用相同的种子将在每次运行时产生相同的结果。
【参考方案1】:
我遇到了同样的问题,最终通过添加 $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);
希望对你有帮助。
【讨论】:
从 laravel 8.2 开始,这不再是必需的了,您可以使用$this->callWith(SeederClass::class, ['param1', 'param2']);
将参数本地传递给播种机【参考方案2】:
任何也在寻找这个的人。接受的答案会起作用,但为什么要把这么简单的事情复杂化呢?
只需使用常量或全局变量。
DatabaseSeeder.php
define('SEEDING_SIZE', 10);
现在在任何播种机中,这将作为“SEEDING_SIZE”提供。
不需要额外的功能。
https://www.php.net/manual/en/function.constant.php
【讨论】:
请不要......不要使用全局变量或常量......这是糟糕的设计【参考方案3】: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);
【讨论】:
感谢发布。救了我一些头发。 有趣的是他们在自述文件中没有提到这一点。超级好用 顺便说一句,有一个小错误。在我的 Laravel 版本(8.14.0)中,您必须更改代码,因为它会导致null
。将其更改为 $this->callWith(UserTableSeeder::class, ['name' => $name1]);
只有 `var_dump($name);` 显示 James
@PhilippMochine 已更正【参考方案4】:
Laravel 8,X
如果提示我获取值,以下是关于该主题的所有最佳答案的组合:
// DatabaseSeeder.php
public function run()
// example 1: Use directly with inside seeder
$name = $this->command->ask( 'Name of first user', 'Jhon Doe' );
$email = $this->command->ask( 'Email of first user', 'default@company.com' );
$password = $this->command->ask( 'Password of first user', '12345678' );
User::factory()->create( [
'name' => $name,
'email' => $email,
'password' => Hash::make( $password )
] );
// example 2: Pass value to inner-Seeder
$answer = $this->command->ask( "Do you want to make this user ($name:$email) an admin? (yes/no)", 'Yes' );
$this->callWith( PermissionSeeder::class, [ 'answer' => $answer ] );
// PermissionSeeder.php
public function run( int|string $answer = null )
// ...
$rootID = null;
if ( isset( $answer ) && ! empty( $answer ) )
if ( is_numeric( $answer ) )
$rootID = (int) $answer;
elseif ( is_string( $answer ) && str_starts_with( strtolower( $answer ), 'y' ) )
$rootID = 1;
echo $rootID ? "User [$rootID] will be elevated to super user" : "[$answer] Ignore set-user-as-root.";
echo "";
if ( $rootID )
$user = User::findOrFail( $rootID );
$user?->assignRole( 'super-utilisateur' );
【讨论】:
以上是关于Laravel将变量从一个种子文件传递到另一个?的主要内容,如果未能解决你的问题,请参考以下文章
MSoft Access - 将变量从一种形式传递到另一种形式
将变量从 node.js 文件传递到另一个文件的最佳方法是啥?