Как получить уникальные значения от фейкера?

Я хотел бы спросить, как создать уникальное значение от фейкера?

Я знаю, что на самом деле это знакомый вопрос, вы можете разместить несколько дублирующих ссылок, например. ссылка 1, ссылка 2, но, к сожалению, эти ссылки не решают мою проблему.


Вот мой код ниже. Я пробовал unique(true), но тот же результат.

return [
    'user_id' => $this->faker->unique()->numberBetween(1, 10),
    //more code here
];

Ниже результат, который я получил. Как видите, вставлено много дубликатов 5.

введите здесь описание изображения


person gecko    schedule 06.10.2020    source источник
comment
Отвечает ли это на ваш вопрос? Как в Laravel получить случайный user_id из таблицы Users для генерации данных заполнения Model Factory?   -  person Kamlesh Paul    schedule 06.10.2020
comment
@KamleshPaul не возвращал уникальные значения, никаких отличий от моего кода выше.   -  person gecko    schedule 06.10.2020


Ответы (2)


фабрика — это реальная проблема, а не фейкер. Я имею в виду вызов фабрики.

Допустим, у вас есть модели User и User_Information, например, поскольку вы не упомянули какие-либо модели в своем вопросе выше.


Я предполагаю, что вы вызываете фабрику, как показано ниже, в которой она создает модели одну за другой отдельно до 10, что делает unique() из faker бесполезными.

\App\Models\User_Information::factory()->create(10);

Мое решение этой проблемы заключается в использовании цикла, чтобы сделать unique() функциональным.

$max = 10;
for($c=1; $c<=$max; $c++) {
    \App\Models\User_Information::factory()->create();
}

ПРИМЕЧАНИЕ. $max не должно быть больше User::count(), иначе будет возвращена ошибка OverflowException.

person Ιησούς του ναυή    schedule 06.10.2020

В моем случае у меня была такая установка

class DomainFactory extends Factory {
    protected $model = Domain::class;

    public function definition() {
       return ['name' => $this->faker->unique()->domainWord()]
    }
}
// Seeder
for ($i = 0; $i < 10; $i++) {
    $domain = Domain::factory()->create();
    ...
}

Который НЕ генерировал уникальные значения для name, потому что я в основном создаю новую фабрику и с ней новый фейкер в каждом цикле. Пришлось выдергивать фабрику из цикла:

// Seeder
$factory = Domain::factory();

for ($i = 0; $i < 10; $i++) {
    $domain = $factory->create();
    ...
}
person CodingKiwi    schedule 09.04.2021