【问题标题】:How do you pass variables to a Factory in Laravel?你如何将变量传递给 Laravel 中的工厂?
【发布时间】:2019-07-29 07:26:22
【问题描述】:

我如何/可以有选择地将数字传递给 Laravel 工厂,以便如果我不提供数字,它会执行默认操作,如果我提供,它会使用它们?

例如,我有一个Student 模型。它会生成一个随机的男性或女性学生,有 50% 的机会使用 Faker 的中间名,正如预期的那样。它看起来像这样:

$factory->define(App\Student::class, function (Faker $faker) {

    $gender = $faker->randomElement($array = array ('m','f'));
    $has_middle_name = $faker->boolean($chanceOfGettingTrue = 50);
    $student = [];

    if ($gender == 'm') {
        $student['first_name'] = $faker->firstNameMale;
        if ($has_middle_name) {
            $student['middle_name'] = $faker->middleNameMale;
        }
    } else {
        $student['first_name'] = $faker->firstNameFemale;
        if ($has_middle_name) {
            $student['middle_name'] = $faker->firstNameMale;
        }       
    }

    $student['last_name'] = $faker->lastName;
    $student['gender'] = $gender;

    $student['birth_date'] = $faker->dateTimeBetween($startDate = '-18 years', $endDate = '-4 years', $timezone = null);

    return $student;

});

我已经看到我可以使用State 作为传递变量的一种方式。例如我可以这样做:

$student = factory(App\Student::class)->state('male')->make();

这将调用我工厂的这个位,因此修改first_namemiddle_namegender 属性以与male 保持一致:

$factory->state(App\Student::class, 'male', function (Faker $faker) {

    $student = [];
    $student['first_name'] = $faker->firstNameMale;
    $has_middle_name = $faker->boolean($chanceOfGettingTrue = 50);
    if ($has_middle_name) {
        $student['middle_name'] = $faker->middleNameMale;
    }    
    $student['gender'] = 'm';

    return $student;

});

但是,我上面的代码创建了一个 4 到 18 岁的学生。如果我想创建一个特定年龄的学生怎么办?我知道我可以这样做让学生在 8 到 9 岁之间:

$birth_date = $faker->dateTimeBetween($startDate = '-9 years', $endDate = '-9 years', $timezone = null);
$student = faker(App\Student::class)->make(['birth_date' => $birth_date]);

但我宁愿做这样的事情:

$student = faker(App\Student::class)->make($minAge = 8, $maxAge = 9);

这可能吗??

【问题讨论】:

    标签: laravel eloquent factory


    【解决方案1】:

    您可以在 Student 模型工厂中定义 min_agemax_age 并使用以下代码:

    $student = faker(App\Student::class)->make(['min_age' => 8, 'max_age' => 9]);
    

    【讨论】:

    • 感谢您的回答。我需要每个学生的出生日期,而不是年龄范围,所以这不能回答问题。
    猜你喜欢
    • 2015-11-29
    • 2019-11-11
    • 2023-03-06
    • 2013-01-25
    • 2020-01-11
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多