我有三个模型,User
,Category
和Article
。
Article
属于User
和Category
,其中外键user_id
和category_id
是not null
。
Am尝试通过工厂相应地用虚假数据为数据库添加种子失败了,这是种子代码...
// 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
传递给工厂电话?
有没有更好的方法来实现这一目标?
预先感谢
答案 0 :(得分:1)
您可以通过将具有所需属性的数组传递给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
答案 1 :(得分:0)
分别分类类别。
然后为用户植入种子,并在其中植入文章。
在商品工厂文件ArticleFactory
中:
$factory->define(App\Article::class, function (Faker $faker) {
return [
'category_id' => App\Category::inRandomOrder()->value('id'),
....
'created_at' => time(),
'updated_at' => time(),
];
});
答案 2 :(得分:0)
这可能对您有帮助
在您从工厂制作新文章时让用户创建
$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());
});