Создать сеялку для таблицы с двумя внешними ключами

Я пытался создать сеялку для таблицы Products с двумя внешними ключами (category_id и sub_category_id для таблиц категорий и sub_categories соответственно).

Category::all()->each(function ($category) {
        SubCategory::all()->each(function ($sub_category) {
            $faker = Faker::create();
            for($i = 0; $i < 3; $i++) {
                DB::table('products')->insert([
                    'product_name' => $faker->name,     
                    'product_description' =>  $faker->sentence,
                    'product_price' =>  rand(100, 1000),
                    'product_quantity' =>  rand(10,100),
                    'category_id' => $category->id,
                    'sub_category_id' =>  $sub_category->id,
                ]);
            }
        });
    });

Пробовал, но он возвращает мне ошибку

Неопределенная переменная: категория

Я могу создать сеялку только с sub_category, но мне также нужно было создать с категорией. Как мне это сделать?


person MDB    schedule 21.04.2020    source источник
comment
Создайте разные сеялки для всех трех таблиц. а затем используйте случайный порядок, чтобы получить случайную категорию и случайную подкатегорию и сохранить это в продукте.   -  person Bhaumik Pandhi    schedule 21.04.2020


Ответы (2)


Как вы знаете, вы передаете анонимную функцию методу each(). Анонимные функции не имеют доступа к переменным вне их области видимости.

Вы должны передать переменную $category методу each() подкатегории следующим образом:

Category::all()->each(function ($category) {
    SubCategory::all()->each(function ($sub_category) use ($category) {
        // now you have access to the $category
    });
});

Как видите, я передаю его use ($category) функции.

person Ali Tavafi    schedule 21.04.2020
comment
@MDB Молодец, брат - person Ali Tavafi; 22.04.2020

Вы используете замыкание для просмотра each элемента в модели SubCategory. Инициализация переменной $category выходит за рамки области закрытия. Чтобы получить доступ к $category, вам необходимо сделать его доступным с помощью ключевого слова use:

SubCategory::all()->each(function ($sub_category) {...});

to

SubCategory::all()->each(function ($sub_category) use ($category) {...});
person kidA    schedule 21.04.2020