Посев моделей с парой случайных, но связанных в разных моделях полей laravel
Есть сущности template, они распределены по сущностям category. У обеих сущностей есть поле type, которое случайно генерируется в фабриках. Но должно совпадать при случайном распределении шаблонов по категориям
Следующий код создает 10 категорий, сохраняет их id-шники в коллекцию и они рандомно назначаются шаблонам. Но вот беда. Их типы должны совпадать. Код ниже не учитывает этой особенности. И типы шаблонов и категорий не совпадают, что логично.
Category::factory()->count(10)->create();
$category_ids = Category::all()->pluck('id');
Template::factory()->count(50)->create([
'category_id' => function () use ($category_ids) {
return $category_ids->random();
}
//Здесь должно быть еще поле 'type'
]);
Попробовал сделать такой вариант, но не сработало
Category::factory()->count(10)->create();
$category_ids = Category::all()->pluck('id');
$random_id = 1;
Template::factory()->count(50)->create([
'category_id' => function () use ($category_ids, &$random_id) {
$random_id = $category_ids->random();
return $random_id;
},
'type' => function () use (&$random_id) {
return Category::find($random_id)->type;
},
]);
Если проверить по $ramdom_id (совпадет id совпадет и тип), то вначале выполняется код для элемента 'type' со значением начальной инициализации
type 1
cat 6
type 6
cat 4
type 4
cat 10
type 10
cat 8
Но если переметить фунцию random() к элементу 'type'
Category::factory()->count(10)->create();
$category_ids = Category::all()->pluck('id');
$random_id = 1;
Template::factory()->count(50)->create([
'type' => function () use ($category_ids, &$random_id) {
$random_id = $category_ids->random();
return Category::find($random_id)->type;
},
'category_id' => function () use (&$random_id) {
return $random_id;
},
]);
То все работает
type 9
cat 9
type 2
cat 2
type 12
cat 12
type 1
cat 1
У меня два вопроса.
- Этот массив обрабатывается в обратном алфавитном порядке или дело в
'category_id'? - Это вообще нормальный способ решения или ерудна? Если ерунда, то тогда как по нормальному сделать?