Laravel雄辩的多重属于种子

时间:2019-09-20 14:39:25

标签: php mysql laravel laravel-seeding

我有三个模型,UserCategoryArticle

Article属于UserCategory,其中外键user_idcategory_idnot 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_iduser_id传递给工厂电话?
有没有更好的方法来实现这一目标?

预先感谢

3 个答案:

答案 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());
});
相关问题