Getting class does not exist error when running database seeder

Viewed 56797

I am creating a seeder in laravel 6.1 but I keep getting this error

Illuminate\Contracts\Container\BindingResolutionException : Target class [AdminsTableSeeder] does not exist.

I tried running composer dump-autoload and composer dumpautoload, it doesn't work for me.

here is my AdminsTableSeeder.php

use App\Models\Admin;
use Faker\Factory as Faker;
use Illuminate\Database\Seeder;

class AdminsTableSeeder extends Seeder
{
/**
 * Run the database seeds.
 *
 * @return void
 */
public function run()
{
    $faker = Faker::create();

    Admin::create([
        'name'      =>  $faker->name,
        'email'     =>  'admin@admin.com',
        'password'  =>  bcrypt('password'),
    ]);
}
}

and here is my DatabaseSeeder.php <?php

 use Illuminate\Database\Seeder;

 class DatabaseSeeder extends Seeder
 {
/**
 * Seed the application's database.
 *
 * @return void
 */
public function run()
{
   $this->call(AdminsTableSeeder::class);
}
}
10 Answers

Make sure your AdminsTableSeeder.php file is in the same directory where you have your DatabaseSeeder.php file.

Run

composer dump-autoload

then try

php artisan db:seed

Optional.

class DatabaseSeeder extends Seeder
{
     /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run(){
        $this->call('AdminsTableSeeder');
    }
}

try with $this->call('AdminsTableSeeder'); like this.

In your case, move all seeder files from previous database/seeds directory to database/seeders folder & then run composer dump-autoload.


Remember, from laravel 8 seeders and factories are namespaced

To accommodate for these changes,

[1] - Add Database\Seeders namespace to your seeder classes.

 namespace Database\Seeders;

[2] - Move all seeder files to database/seeders folder.

[3] - If you import any seeders classes in DatabaseSeeder file then remove all of them. (simply remove all lines that started with use Database\Seeders\... from DatabaseSeeder.php)

[4] - Finally run dump-autoload.

composer dump-autoload

You can now try a fresh migration with seed,

php artisan migrate:fresh --seed

For my case(I use Laravel 8), I solved my problem by modifying the RouteServiceProvider.php file in App/Providers/ path. I uncommented code on line 29.

protected $namespace = 'App\\Http\\Controllers';

It worked for me.

run

composer dump-autoload

then try

php artisan db:seed

For Laravel 8:

I have the same issue and I found a solution in Laravel doc and it's worked for me.

https://laravel.com/docs/8.x/upgrade#seeder-factory-namespaces

Update Composer:

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

Run:

composer dumpautoload

php artisan db:seed --force

Concerning my case, I used the latest Laravel 8 which is the latest version, I solved my problem by changing the RouteServiceProvider.php file in App/Providers/ path by uncommenting the code on line 29.

protected $namespace = 'App\Http\Controllers';

For Laravel ^7.0

If your using Laravel Eloquent

Example:

<?php

use App\Models\User;
use Illuminate\Database\Seeder;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        $users = [
            [
                'id'             => 1,
                'name'           => 'Admin',
                'email'          => 'admin@admin.com',
                'password'       => bcrypt('password'),
                'remember_token' => null,
            ],
        ];

        User::insert($users);
    }
}

If your using Laravel Query Builder

Example:

<?php

//Do not use -> namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;

class UsersTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->insert([
            'name'           => 'Admin',
            'email'          => 'admin@admin.com',
            'password'       => bcrypt('password'),
            'remember_token' => null,
        ]);
    }
}

In your DatabaseSeeder.php

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call([
            UsersTableSeeder::class,
        ]);
    }
}

Seems like the controller name is case-sensitive in Laravel 8. So my suggestion is to double-check the controller name.

For instance: in web.php avoid calling

UserAPIController

as

UserApiController

(API as api)

It may fix this error.

In your DatabaseSeeder.php, you can add the nameSpace for AdminsTableSeeder like -

use App\Models\Admin\AdminsTableSeeder;

Closing the current running serve before doing db:seeds

Related