Запретить создание модели отношения на фабрике, если в качестве атрибута передан внешний идентификатор - PullRequest
0 голосов
/ 11 мая 2018

Давайте предположим, что это фабрика:

PostFactory.php

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

тогда я использую это так:

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

Я ожидаю, что будет создано 1 пользователь и 5 сообщений. Но на самом деле в базе данных 6 пользователей, потому что PostFactory создает пользователя независимо от того, передан user_id или нет.

Есть ли способ предотвратить создание нового пользователя, если атрибут user_id передан методу create?

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Для Larave 5.1 вам нужно будет передать параметр и вручную проверить, передан ли id.

Вот обсуждение вопроса.https://github.com/laravel/framework/issues/9245

$factory->define(App\User::class, function ($faker, $attributes) {

$accountId = isset($attributes['account_id']) ? $attributes['account_id']: factory(App\Account::class)->create()->id;

return [
    'account_id' => $accountId,
    'email' => $faker->email,
    'password' => 'secret',
    'name' => $faker->name
];

});

0 голосов
/ 11 мая 2018

Для этого есть обходной путь.

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

Laravel вызывает помощника value() при объединении атрибутов. Если user_id существует в атрибутах, он не будет выполнять обратный вызов, в противном случае он будет.

Вы можете увидеть это в документе здесь с точно такими же моделями, что и у вас.

...