簡體   English   中英

Laravel eloquent 多屬於播種

[英]Laravel eloquent multiple belongsTo seeding

我有三個模型, UserCategoryArticle

Article屬於UserCategory ,其中外鍵user_idcategory_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_iduser_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM