Почему 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...
}
}
}