За последние 24 часа нас посетили 20148 программистов и 1078 роботов. Сейчас ищет 751 программист ...

Faker создаёт одинаковые записи, хотя указано unique()

Тема в разделе "Laravel", создана пользователем Anaksagor, 18 сен 2018.

  1. Anaksagor

    Anaksagor Активный пользователь

    С нами с:
    21 ноя 2017
    Сообщения:
    21
    Симпатии:
    0
    Приветствую всех!

    СУБД выдаёт Integrity constraint violation: 1062 Duplicate entry, когда незначительно меняю код в ModelFactory, т.е. Faker выдаёт одинаковые e-mail, хотя указано unique()
    PHP:
    1. 'email' => $faker->unique()->safeEmail,
    При приведённом ниже коде СУБД выдаёт эту ошибку:
    ModelFactory.php
    PHP:
    1. $factory->define(App\User::class, function () {
    2.     $faker = Faker\Factory::create('ru_RU');           //duplicate entries occuring, why?
    3.  
    4.     static $password;
    5.  
    6.     $hierarchyLevel = $faker->numberBetween($min = 2, $max = 5);
    7.  
    8.     switch ($hierarchyLevel) {
    9.         case 2:
    10.             $salary = $faker->numberBetween($min = 60000, $max = 90000);
    11.             break;
    12.         case 3:
    13.             $salary = $faker->numberBetween($min = 40000, $max = 60000);
    14.             break;
    15.         case 4:
    16.             $salary = $faker->numberBetween($min = 20000, $max = 40000);
    17.             break;
    18.         case 5:
    19.             $salary = $faker->numberBetween($min = 10000, $max = 20000);
    20.             break;
    21.     }
    22.  
    23.     return [
    24.         'name' => $faker->name,
    25.         'email' => $faker->unique()->safeEmail,
    26.         'password' => $password ?: $password = bcrypt('123456'),
    27.         'position' => $faker->jobTitle,
    28.         'date_of_employment' => $faker->date($format = 'Y-m-d', $max = 'now'),
    29.         'salary' => $salary,
    30.         'hierarchy_level' => $hierarchyLevel,
    31.         'remember_token' => str_random(60),
    32.     ];
    33. });
    Во втором вырианте ошибки нет, но в этом случае я не знаю как заставить Faker выдавать данные на русском:
    ModelFactory.php
    PHP:
    1. $factory->define(App\User::class, function (Faker\Generator $faker) {
    2.  
    3. //работает, но данные на английском
    4.  
    5.     static $password;
    6.  
    7.     $hierarchyLevel = $faker->numberBetween($min = 2, $max = 5);
    8.  
    9.     switch ($hierarchyLevel) {
    10. //        case 1:
    11. //            $salary = $faker->numberBetween($min = 90000, $max = 120000);
    12. //            break;
    13.         case 2:
    14.             $salary = $faker->numberBetween($min = 60000, $max = 90000);
    15.             break;
    16.         case 3:
    17.             $salary = $faker->numberBetween($min = 40000, $max = 60000);
    18.             break;
    19.         case 4:
    20.             $salary = $faker->numberBetween($min = 20000, $max = 40000);
    21.             break;
    22.         case 5:
    23.             $salary = $faker->numberBetween($min = 10000, $max = 20000);
    24.             break;
    25.     }
    26.  
    27.     return [
    28.         'name' => $faker->name,
    29.         'email' => $faker->unique()->safeEmail,
    30.         'password' => $password ?: $password = bcrypt('123456'),
    31.         'position' => $faker->jobTitle,
    32.         'date_of_employment' => $faker->date($format = 'Y-m-d', $max = 'now'),
    33.         'salary' => $salary,
    34.         'hierarchy_level' => $hierarchyLevel,
    35.         'remember_token' => str_random(60),
    36.     ];
    37. });
    Прошу помощи, нужно заставить faker выдавать русские данные при втором варианте, или что-то исправить в первом или третий вариант :)
    Заранее спасибо.
     
  2. Anaksagor

    Anaksagor Активный пользователь

    С нами с:
    21 ноя 2017
    Сообщения:
    21
    Симпатии:
    0
    Ага.
    Почему так происходит я точно не понял, возможно, каждый раз получается новый instance of Faker\Factory, не знаю. Но зато точно понял как настроить Faker на русский. Нужно либо вставить этот код в AppServiceProvider в метод register()
    PHP:
    1. $this->app->singleton(FakerGenerator::class, function () {
    2.           return FakerFactory::create('en_GB');
    3.         });
    либо надо в config/app.php создать
    PHP:
    1. 'faker_locale' => ru_RU
    или так:
    'faker_locale' => env('FAKER_LOCALE', 'en_US'),

    а в файле .env создать ещё опцию

    Код (Text):
    1. FAKER_LOCALE=ru_RU
    .

    Проверил на Laravel 5.4 — работает.

    Взято отсюда: https://github.com/laravel/ideas/issues/398