Why Laravel keeps calling schedule() with every Artisan Command?

Technically the schedule method ist called via the constructor of Illuminate\Foundation\Console\Kernel ( This is the parent class of app\Console\Kernel.php)

So every time the console Kernel is instantiated, the schedule() method gets executed.

Let's see what gets executed in which scenario ( $schedule->call() can be replaced with $schedule->command() or $schedule->exec()):

protected function schedule(Schedule $schedule)
{
    // everything that is inside the schedule function is executed everytime the console kernel is booted.

    // gets exectuted every time
    \App\User::where('foo', 1)->get();


    $schedule->call(function() {
        // gets executed for every call to php artisan schedule:run
        \App\User::where('foo', 1)->get();
    });

    $schedule->call(function() {
        // gets executed for every call to php artisan schedule:run
        // IF the closure in the when() function is true;

        \App\User::where('foo', 1)->get();
    })->when(function() {
         // if true is returned the scheduled command or closure is executed otherwise it is skipped
         \Schema::hasColumn('user', 'foo');
    });

}

But why HAS the schedule command to be exectuted with every command?

Well, obviously php artisan schedule:run is a console command itself. So it definitely needs information about scheduled commands.

Also other commands could need information about scheduled commands... For example if you want to write an artisan command list:scheduledTasks. This command would require that all scheduled commands have been added to the console schedule list.

Maybe there are several other (internal) arguments why the schedule function has to run everytime. ( I did not dig too deep in the source code... )
Nevertheless... information about scheduled commands could be useful to a variety of use cases.


Your error is with table dc_user_meta while your logic is of table user_meta you need to do Schema::hasTable('dc_user_meta')