У меня есть три модели: 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
Выделите категории отдельно.
Затем засейте пользователей и внутри него засейте статьи. В заводском файле артикула
ArticleFactory
:inRandomOrder
не достигнет 6 статей в каждой категории — person Salim Djerbouh; 20.09.2019@CaddyDZ, затем измените его на
withCount('articles')->orderBy('articles_count', 'asc')
— person Salim Djerbouh; 20.09.2019Это может вам помочь
Первый
заставлять пользователей творить, когда вы делаете новую статью с завода
Второй
из вашей сеялки в этом примере я сделаю 3 категории * 6 статей
$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
Вы можете переопределить атрибуты для своей фабрики, передав массив с нужными атрибутами методу
make()
:Изменять
to
, чтобы переопределить атрибут
category_id
.https://laravel.com/docs/6.x/database-testing#using-factories