如果外部 ID 作为属性传递,则防止在工厂中创建关系模型

And*_*kiy 1 factory laravel laravel-5.6

让我们假设这个工厂:

后工厂.php

$factory->define(Post::class, function (Faker $faker) {
    return [
        'title'=>$faker->word,
        'user_id'=>factory(User::class)->create()->id
    ];
});
Run Code Online (Sandbox Code Playgroud)

然后我像这样使用它:

$user = factory(User::class)->create();
factory(Post::class, 5)->create(['user_id'=>$user->id]);
Run Code Online (Sandbox Code Playgroud)

我希望将创建 1 个用户和 5 个帖子。但实际上数据库中有6个用户,因为PostFactory无论是否user_id通过都会创建用户。

如果user_id属性传递给create方法,有没有办法阻止创建新用户?

Pet*_*666 6

有一个解决方法。

$factory->define(Post::class, function (Faker $faker) {
    return [
        'title'=>$faker->word,
        'user_id'=> function () { return factory(User::class)->create()->id; }
    ];
});
Run Code Online (Sandbox Code Playgroud)

Laravelvalue()在合并属性时正在调用帮助程序。如果user_id存在于属性中,则不会执行回调,否则会执行。

您可以在此处的文档中看到与您的模型完全相同的模型。