[英]Laravel eloquent multiple belongsTo seeding
我有三個模型, 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
傳遞給工廠調用?
有沒有更好的方法來實現這一點?
提前致謝
您可以通過將具有所需屬性的數組傳遞給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
分別播種類別。
然后播種用戶並在其中播種文章。 在文章工廠文件ArticleFactory
中:
$factory->define(App\Article::class, function (Faker $faker) {
return [
'category_id' => App\Category::inRandomOrder()->value('id'),
....
'created_at' => time(),
'updated_at' => time(),
];
});
這可能會幫助你
當您從工廠制作新文章時讓用戶創建
$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());
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.