Как передать переменные на фабрику в Laravel? - PullRequest
0 голосов
/ 07 марта 2019

Как / можно выборочно передавать числа в Фабрику 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_name, middle_name и gender, чтобы соответствовать 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);

Возможно ли это?

1 Ответ

0 голосов
/ 07 марта 2019

Вы можете определить min_age и max_age для своей фабрики моделей Student и использовать следующий код:

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