0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Factoryタイプ?ナニソレ...。Laravel6→Laravel7へのアップグレードでハマりました

Last updated at Posted at 2023-02-21

Laravel6.xからLaravel7.xにアップグレードし、PHPUnitを動かすとエラー。モデルファクトリの挙動が変わったよう。
公式に載ってないやつかな?と思ったらどうやらサラッと書いてあったこちら、Factoryタイプ機能削除に関連していたみたい。

Laravel6までは

// ファクトリの記述
$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => factory(App\User::class),
        'hoge' => 'hoge',
    ];
}, 'hoge');

第三引数に文字列をセットできていました。

// モデルの保存
$post = factory(App\Post::class, 'hoge')->create();

そして保存時に第二引数にファクトリに記述した文字列を渡すことで、hogeの配列が保存されます。

この機能がLaravel7から廃止されたため、使えなくなりました。代替としてファクトリステートを使います。

// ファクトリの記述
$factory->define(App\Post::class, function ($faker) {
    return [
        'title' => $faker->title,
        'content' => $faker->paragraph,
        'user_id' => factory(App\User::class),
    ];
});

// ファクトリステート
$factory->state(App\Post::class, 'hoge', [
    'hoge' => 'hoge',
]);

ファクトリステートを記述しておくと、呼び出し側(保存時)でstate('hoge')を呼び出すとデフォルトの配列に['hoge' => 'hoge']というレコードを追加した配列が作成できます。

// モデルの保存
$post = factory(App\Post::class)->state('hoge')->create();

以上、Laravel7へのアップグレードでハマった件でした。ファクトリタイプ機能は2016年10月からドキュメントに記載していません、とのことだったので油断していました。ガッツリ使用していたので大きめの修正になりました。

Factoryタイプについて調べても全然記事が出てこなかったのでこちらに備忘録として残しておきます。
この件がFactoryタイプで合っているのかもわかりません。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?