Laravel красноречивый множественный принадлежит к раздаче

У меня есть три модели: User, Category и Article.

Article принадлежит как User, так и Category, где внешние ключи user_id и category_id равны not null.

Я потерялся, пытаясь заполнить базу данных поддельными данными через фабрики, соответственно, вот код заполнения …

// 2 categories and 12 articles, 6 per category
// TODO: A user should have 6 articles with mixed categories 
// 3 from each category
// So we will have 2 users
factory(Category::class, 2)->create()->each(function($category) {
    factory(User::class)->create()->each(function($user) use ($category) {
        // How to assign an Article to $category or $user while creating?
        $user->articles()->createMany(
                    factory(Article::class, 3)->make()->toArray()
                ); // category_id can't be null
        // OR
        $category->articles()->createMany(
                    factory(Article::class, 3)->make()->toArray()
                ); // user_id can't be null
    });
});

Я получу одну из двух ошибок, либо

Столбец user_id не имеет значения по умолчанию

Or

Столбец category_id не имеет значения по умолчанию

Что логично из-за Article миграции таблицы

$table->increments('id');
$table->unsignedInteger('user_id');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->unsignedInteger('category_id');
$table->foreign('category_id')->references('id')->on('categories')->onDelete('cascade');

Как я могу передать category_id или user_id заводскому вызову?
Есть ли лучший способ добиться этого?

заранее спасибо

Добавить их вот так? factory(Article::class, 3)->make(['category_id' => $category->id])->toArray() Это работает?   —  person Salim Djerbouh    schedule 20.09.2019

@kerbholz да, спасибо, дайте ответ, и я проголосую и приму   —  person Salim Djerbouh    schedule 20.09.2019

См. также:  FutureBuilder продолжает запускать метод будущего
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 3
  1. Salim Djerbouh

    Выделите категории отдельно.

    Затем засейте пользователей и внутри него засейте статьи. В заводском файле артикула ArticleFactory:

    $factory->define(App\Article::class, function (Faker $faker) {
    
        return [
            'category_id' => App\Category::inRandomOrder()->value('id'),
            ....
            'created_at' => time(),
            'updated_at' => time(),
        ];
    });
    

    inRandomOrder не достигнет 6 статей в каждой категории person Salim Djerbouh; 20.09.2019

    @CaddyDZ, затем измените его на withCount('articles')->orderBy('articles_count', 'asc') person Salim Djerbouh; 20.09.2019

  2. Salim Djerbouh

    Это может вам помочь

    Первый

    заставлять пользователей творить, когда вы делаете новую статью с завода

    $factory->define(App\Article::class, function ($faker) use ($factory)  {
        return [
            'user_id' => $factory->create(App\User::class)->id,
            'title' => $faker->sentence,
            'body' => $faker->paragraph
        ];
    });
    

    Второй

    из вашей сеялки в этом примере я сделаю 3 категории * 6 статей

    factory('App\Category', 3)->create()->each(function($u) {
        $u->posts()->save(factory('App\Article', 6)->create());
    });
    

    $factory->create(App\User::class)->id будет привлекать нового пользователя для каждой статьи, не удовлетворяет требованиям A user should have 6 articles, таким образом у пользователя будет только 1 статья person Salim Djerbouh; 20.09.2019

    Нет первой части только для создания пользователя для каждой статьи на заводе, но в вашем сидере вы создадите 3 категории, каждая из которых имеет 6 статей person Salim Djerbouh; 20.09.2019

  3. Salim Djerbouh

    Вы можете переопределить атрибуты для своей фабрики, передав массив с нужными атрибутами методу make():

    Изменять

    $user->articles()->createMany(
      factory(Article::class, 3)->make()->toArray()
    );
    

    to

    $user->articles()->createMany(
      factory(Article::class, 3)->make([
        'category_id' => $category->id
      ])->toArray()
    );
    

    , чтобы переопределить атрибут category_id.

    https://laravel.com/docs/6.x/database-testing#using-factories

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: