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 中生成名称。 对于我想要做的事情,我需要一些列来匹配其他表中的相同值,这就是我在类之外设置变量的原因。例如,我将生成一个随机数,并且我想将相同的数字传递给 UserTableSeederPersonTableSeeder 你必须为一个用户创建一个人,这个用户会有随机数。 我不确定我理解你的意思抱歉。可以举个例子吗? 也许看看在 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-&gt;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-&gt;callWith(UserTableSeeder::class, ['name' =&gt; $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 - 将变量从一种形式传递到另一种形式

RequireJS:如何将变量从一个文件传递到另一个文件?

Laravel 将数据从一个视图传递到另一个视图

将变量从 node.js 文件传递​​到另一个文件的最佳方法是啥?

通过 Laravel 中的 AJAX 发布请求将值从一个视图传递到另一个视图

将 PHP 变量从一个插件文件传递到另一个 WordPress