首页 > 解决方案 > Laravel 雄辩的多属于播种

问题描述

我有三个模型UserCategoryArticle

Article属于 aUser和 a Category,其中外键user_idcategory_idnot 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_idor传递user_id 给工厂调用?
有没有更好的方法来实现这一点?

提前致谢

标签: phpmysqllaravellaravel-seeding

解决方案


您可以通过将具有所需属性的数组传递给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


推荐阅读