Почему Laravel продолжает называть расписание() с каждой командой Artisan?

У меня есть одна таблица под названием dc_user_meta, и я создал одну команду artisan и запланировал ее в kernel.php. После клонирования репозитория, когда я пытаюсь запустить PHP artisan migrate, я получаю эту ошибку.

  [Illuminate\Database\QueryException]                                                                                                              
  SQLSTATE[42S02]: Base table or view not found: 1146 Table 'database.dc_user_meta' doesn't exist (SQL: select * from `dc_user_met  
  a` where `meta_key` = usage_in_days)

Не только PHP artisan migrate, но я вообще не могу запустить команду artisan! Я не знаю, почему PHP продолжает вызывать метод schedule каждый раз, когда я пытаюсь выполнить любую команду artisan.

Здесь в этом случае, что я могу сделать, чтобы решить эту ошибку, поместите мою логику в метод schedule, как это.

if(Schema::hasTable('dc_user_meta')){
    // Code here
}

Но я не думаю, что это хорошо в долгосрочной перспективе. Какой правильный способ решить эту ошибку?


UPDATE: Я просто попробовал закрыть вызов команды kernel.php, как это, но все равно не удался!

if(Schema::hasTable('dc_user_meta')){
    $schedule->command('usage:update')->daily();
}

UPDATE: Я получил решение. Но я не думаю, что это ответ на вопрос. Он решает мою проблему, но я не думаю, что это стандартное решение. Я просто закрыл вход в систему так, как это.

if(Schema::hasTable('dc_user_meta')){
    // Command Logic
}

Любой конкретный ответ на вопрос, почему Laravel называет расписание() с каждой командой artisan и как разрешить ошибку стандартным способом, если что-то подобное происходит!

Ответ 1

Технически метод расписания ist вызывается через конструктор Illuminate\Foundation\Console\Kernel (это родительский класс app\Console\Kernel.php)

Таким образом, каждый раз, когда создается консольное ядро, выполняется расписание().

Посмотрим, что будет выполнено, в каком сценарии ($ schedule- > call() можно заменить $schedule- > command() или $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');
    });

}

Но почему HAS команда расписания вызывается с каждой командой?

Ну, очевидно, расписание php artisan: run - это сама консольная команда. Поэтому ему определенно нужна информация о запланированных командах.

Также другим командам может понадобиться информация о запланированных командах... Например, если вы хотите написать команду artisan list: scheduleTasks. Эта команда потребует, чтобы все запланированные команды были добавлены в список расписания консоли.

Возможно, есть несколько других (внутренних) аргументов, почему функция расписания должна запускаться каждый раз. (Я не слишком глубоко копал в исходном коде...)
Тем не менее... информация о запланированных командах может быть полезна для различных случаев использования.

Ответ 2

Ваша ошибка связана с таблицей dc_user_meta, в то время как ваша логика имеет таблицу user_meta, вам нужно сделать Schema::hasTable('dc_user_meta')

Ответ 3

Я убежден, что таблица dc_user_meta не существует в базе данных.

Ответ 4

Как я понимаю, у меня есть таблица "user_meta", а не "dc_user_meta" , но вы написали код для использования таблицы "dc_user_meta" , поэтому есть ошибка, указывающая, что таблица "dc_user_meta" не найдена.

Ответ 5

Если кто-то все еще заботится об этом...

<?php
# This is your app/Console/Kernel.php
use ...;

class Kernel extends ConsoleKernel {

    # Other stuff...

    protected function schedule(Schedule $schedule) {
        if( in_array('schedule:run', $_SERVER['argv']) ){
            # Your scheduler commands here...
        }
    }

}