Laravel | Фабрика посева базы данных

В настоящее время я изучаю фабрики Laravel и то, как они работают. Пока что я нашел их действительно полезными!

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

В настоящее время у меня есть это, поэтому он создает бизнес вместе с пользователем, однако теперь это начинает усложняться, поэтому я публикую здесь.

В бизнесе мне также нужно создавать категории, местоположения, изображения и контакты. Я предполагаю, что все они будут работать одинаково, поэтому я хочу спросить только о категориях.

По сути, то, что я хочу сделать, - это когда бизнес будет создан, я хотел бы создавать категорию для каждых 10 предприятий, так как это позволило бы мне отображать их так, как они выглядели бы в реальной жизненной ситуации.

Итак, в настоящее время у меня есть этот код ...

factory(App\Models\User::class, 50)->create()->each(function ($u) {
    $u->business()->save(factory(App\Models\Business::class)->make());
});

Это идеально подходит для создания бизнеса, связанного с пользователем, но где бы я поместил категорию? Придется ли мне здесь творить? И скажите, каждый раз, когда есть число, кратное 10, тогда создавайте категорию? Потому что категория в любом случае не связана с пользователем, поэтому я не смогу делать что-то вроде $u->categeory, мне бы пришлось получить доступ к бизнес-модели.

Это фабрика бизнес-категории ...

$factory->define(App\Models\BusinessCategory::class, function (Faker $faker) {
    return [
        'friendly_name' => $faker->word,
        'slug' => ucfirst($faker->word)
    ]
});

Заранее спасибо.

Будет ли у каждого бизнеса своя категория? Я предполагаю, что вы хотите, чтобы каждый бизнес принадлежал к какой-либо категории, но не каждый бизнес имел новую категорию (поэтому каждые ~ 10 компаний будут иметь одну и ту же категорию). Верно ли мое предположение? Или только 1/10 бизнеса действительно будет иметь категорию.

DevK 16.03.2018 23:07

Ваше предположение верно, да, это именно то, чего я хочу достичь.

user8116198 16.03.2018 23:08

Написал что-то, что должно вас направить. Сообщите мне, если это сработает. Я не уверен на 100%, что $u->business()->save(...) действительно вернет бизнес-модель. В противном случае он не будет работать как есть.

DevK 16.03.2018 23:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
3
272
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я не тестировал решение, поэтому, возможно, потребуется выполнить некоторую тонкую настройку, но попробуйте это и дайте мне знать, работает ли оно:

// Number of users
$numberOfUsers = 50;

// Will create roughly 1 business category per 10 users
$businessCategories = factory(App\Models\BusinessCategory::class, round($numberOfUsers/10))->create();

factory(App\Models\User::class, $numberOfUsers)->create()->each(function ($u) use ($businessCategories) {
    $business = $u->business()->save(factory(App\Models\Business::class)->make());
    // Associate it with a random business category
    $business->businessCategory()->attach(
        $businessCategories->random()->id
    );
});

Редактировать

Или вы можете пойти другим путем и сделать что-то вроде этого:

// Create 5 categories
factory(App\Models\BusinessCategory::class, 5)
    ->create()
    ->each(function ($bc) {
        // Create 10 users per business category
        factory(App\Models\User::class, 10)->create()->each(function ($u) use ($bc) {
            // Create a business for the user
            $u->business()
                ->save(factory(App\Models\Business::class)->create([
                    'business_category_id' => $bc->id // Associate it with the business category
                ]));
        });
    });

Оба решения предполагают, что Business принадлежит BusinessCategory. И нижний также предполагает business_category_id для столбца внешнего ключа.

Привет, спасибо за ответ. Первый метод кажется мне наиболее подходящим, однако я получаю сообщение об ошибке: associate не существует. Сейчас попробую второй способ.

user8116198 17.03.2018 00:14

Единственная проблема со вторым методом. Он основан на создании пользователей и предприятий. Однако мне также нужно будет делать бизнес-изображения и т. д.

user8116198 17.03.2018 00:14

Я это подозревал! Используя вашу базу первого, мне удалось это сделать! В общем, у меня связь belongsToMany, поэтому associate не существует. Следовательно, запуск этой строки $business->categories()->attach($businessCategories->random(‌​)->id); делает именно то, что мне нужно!

user8116198 17.03.2018 00:20

Ах, отлично! Имеет смысл, ->associate() работал бы с другой стороны. Моя ошибка. Собираюсь отредактировать ответ, чтобы исправить это. Обновлено: на самом деле не будет, он будет работать на belongsTo

DevK 17.03.2018 00:22

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

user8116198 17.03.2018 00:23

У меня есть еще один вопрос, devk, можем ли мы поговорить об этом?

user8116198 17.03.2018 00:29

Конечно, я просто не совсем понимаю, как

DevK 17.03.2018 00:30

Другие вопросы по теме