laravel 如何增加工厂定义的变量

ct3nt3jp  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(102)

我正在使用Laravel 9,我做了这个工厂,它将一些数据插入到Question && Category模型之间的数据透视表中:

class CategoryQuestionFactory extends Factory
{
    /**
     * Define the model's default state.
     *
     * @return array<string, mixed>
     */
    public function definition()
    {
        if(isset($counter)){
            $question = Question::find($counter);
        }else{
            $counter = 1;
            $question = Question::find($counter);
        }

        return [
            'category_id' => $this->faker->numberBetween(1,22),
            'question_id' => $question->id
        ];

        $counter++;
    }
}

基本上,当这个Factory第一次执行时,它会插入1question_id,以及122之间的随机数作为category_id
但是因为我需要多次运行这个工厂(它应该运行50次),所以我将以下代码添加到**DatabaseSeeder.php**:

public function run()
{
    for($i=0;$i<50;$i++){
        (new CategoryQuestionFactory())->create();
    }
}

但是,因为接下来我不想再次插入1question_id,所以我定义了一个名为$counter的变量,它也会在函数结束时递增(以获取 questions 表中问题的下一条记录):

if(isset($counter)){
            $question = Question::find($counter);
        }else{
            $counter = 1;
            $question = Question::find($counter);
        }

        return [
            ...
        ]

        $counter++;

但现在的问题是,$counter的值没有增加,因此,它在所有50次中插入1

因此,问题是,如何在Factory函数中定义变量,以便下次运行代码时,此变量已经递增,无需从头开始。

更新#1:

更新#2:

5sxhfpxr

5sxhfpxr1#

Laravel 8引入了新的工厂类,因此您的请求可以看起来像:

class CategoryQuestionFactory extends Factory {

    private static $questionId = 1;

    protected $model = Question::class;

    public function definition() {
         $question = Question::find(self::$questionId);

         self::$questionId++;
         return [
            'category_id' => $this->faker->numberBetween(1,22),
            'question_id' => $question->id
        ];

    }

在数据库播种程序中添加以下内容

CategoryQuestion::factory()->times(50)->create();

相关问题