如何将 null 参数从播种机传递给 Laravel 工厂?

Posted

技术标签:

【中文标题】如何将 null 参数从播种机传递给 Laravel 工厂?【英文标题】:How to pass null argument to Laravel Factory from the seeder? 【发布时间】:2021-07-11 16:41:51 【问题描述】:

我有一个这样的工厂定义:

public function definition() 

        $to = $this->faker->numberBetween(1, 3);

        return [
            "ad_id" => $to == 1 ? Ad::all()->random()->id : null,
            "delivery_id" => $to == 2 ? Delivery::all()->random()->id : null,
            "group_event_id" => $to == 3 ? GroupEvent::all()->random()->id : null,
        ];;
        

基本上,有3个字段,但只能定义一个,如果定义了一个,其他的必须为null,工厂使用faker来决定它,但是现在,我想从播种器中设置我想要的:

MyModel::factory()->create([
      "ad_id" => null,
      "delivery_id" => 5,
      "group_event_id" => null,
]);

但这不起作用,工厂忽略了我为其他字段传递的空参数,并为这两个空参数设置了随机 ID。我该如何解决?

【问题讨论】:

您的问题有点太不清楚了,请将整个工厂代码发布给您,当然要替换敏感位,按逻辑您显示的内容应该可以工作 【参考方案1】:

我认为您正在寻找的是:https://laravel.com/docs/8.x/database-testing#sequences

【讨论】:

很高兴知道这一点,但这不是我的问题,我的问题是将值从播种机传递到工厂:( 您能否更新您的问题,更清楚地表达您想要实现的目标?【参考方案2】:

您基本上需要在致电工厂之前进行检查。您不能传递一个值,以便工厂读取并处理它,不幸的是它反过来,所以工厂制作了一个模板,然后被您在 make/create 函数中传递的数组中的值覆盖,所以您唯一能做的就是在调用创建之前进行检查并填写。

【讨论】:

有没有办法在工厂的定义方法中传参数? ? @CarlosTinnelly 不,工厂比传递参数的时间要早​​得多。如果你去找文档,有工厂指令(不记得确切的名称)。

以上是关于如何将 null 参数从播种机传递给 Laravel 工厂?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 ADO 和 VB 将 NULL 或空字符串传递给存储过程输入参数?

为啥从 jquery 传递给控制器​​方法的参数即使不是 null 也是 null?

如何将null值传递给简单注入器中的构造函数?

我可以将 argv 从 main 传递给 execv 吗?

传递给新窗口的JavaFX参数变为NULL [重复]

为啥将 null 传递给 params 方法会导致 null 参数数组?