Laravel красноречивый множественный принадлежит к посеву - PullRequest
0 голосов
/ 20 сентября 2019

У меня есть три модели, 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 не имеет значения по умолчанию

Или

Столбец 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 на заводской вызов?
Есть ли лучший способ добиться этого?

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

Ответы [ 3 ]

1 голос
/ 21 сентября 2019

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

Изменить

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

на

$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

0 голосов
/ 20 сентября 2019

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

Первый

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

$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());
});
0 голосов
/ 20 сентября 2019

Разделяйте категории по отдельности.

Затем отбирайте пользователей, а внутри них заполняйте статьи.В статье фабричный файл ArticleFactory:

$factory->define(App\Article::class, function (Faker $faker) {

    return [
        'category_id' => App\Category::inRandomOrder()->value('id'),
        ....
        'created_at' => time(),
        'updated_at' => time(),
    ];
});
...