1
3

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 3 years have passed since last update.

Laravel8にアップグレード後にfakerのseedingでTarget class [Database\Seeders\] does not existでハマる

Last updated at Posted at 2020-12-08

Laravel7で開発したアプリをLaravel8にアップグレードしてFakerを使おうとしたら以下のようなエラーが出てハマりました。

Target class [Database\Seeders\UsersTableSeeder] does not exist

seedsディレクトリ名を変更

Laravel7まではdatabase/__seeds__だったのがLaravel8ではdatabase/__seeders__になりました。そもそもエラーがTarget class [Database\ Seeders] does not existですしね。
(seedsでもseedersでもどっちでもいいよと思うのは私だけ?混乱するような面倒な変更はしないで欲しい・・・)
なので、まずはディレクトリ名をseedersに変更します。

$ mv database/seeds database/seeders

composer.jsonを修正

ディレクトリ名の変更に合わせてcomposer.jsonも変更します。

"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Factories\\": "database/factories/",
        "Database\\Seeders\\": "database/seeders/"
    }
}

"classmap"は必要なくなったようなので削除します。

Factoryを作り直す

私が使っているのはUserFactory.phpです。Laravel8ではFactoryの内容も変更になったので書き換える必要があります。
現在のUserFactory.phpを修正してもいいのですが、面倒なので元のファイルを違う名前にして保存しておき、新たにartisanコマンドで作り直します。

$ mv UserFactory.php UserFactory7.php 
$ php artisan make:factory UserFactory

新しいUserFactory.phpが出来上がったらUserFactory7.phpから必要な箇所を移植します。
気を付けなければならないのは、$fakerは$this->fakerにしないとならないこと。

database/factories/UserFactory.php
return [
    $faker->name; // ~Laravel7
    $this->faker->name; // Laravel8
];

*作業が終わったらUserFactory7.phpは消しておきましょう。

モデルを修正

HasFactoryを追加します。

app/User.php
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Factories\HasFactory; // 追加

class User extends Authenticatable
{
    use Notifiable;
    use HasFactory; // 追加

DatabaseSeederを修正

namespace Database\Seedersを追加します。

database/seeders/DatabaseSeeder.php
namespace Database\Seeders; // 追加

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder

UsersTableSeederを修正

namespaceを追加します。また、seeder内のcreate文の書き方が変わりました。

database/seeders/UsersTableSeeder.php
namespace Database\Seeders; // 追加

use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        // factory(App\User::class, 30)->create(); // ~Laravel7
        \App\User::factory()->count(30)->create(); // Laravel8
    }

実行

最後にcomposer dump-autoloadしてからseedします。

$ composer dump-autoload
$ php artisan db:seed --class=UsersTableSeeder
1
3
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?