我有一个名为dc_user_meta
的表,我创建了一个工匠命令并在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
而且我根本无法执行任何工匠命令!我不知道为什么PHP每次尝试执行任何artisan命令时都会调用schedule
方法。
在这种情况下,我可以做的就是解决这个错误,就像这样在schedule
方法中覆盖我的逻辑。
if(Schema::hasTable('dc_user_meta')){
// Code here
}
但我不认为它在长期运行中表现良好。什么是解决此错误的正确方法?
的更新:
我只是尝试在kernel.php
覆盖调用命令,但仍然没有成功!
if(Schema::hasTable('dc_user_meta')){
$schedule->command('usage:update')->daily();
}
更新 我得到了解决方案。但我不认为这是问题的答案。它解决了我的问题,但我不认为这是标准的解决方案。我只是被Command登录所覆盖。
if(Schema::hasTable('dc_user_meta')){
// Command Logic
}
Laravel为每个artisan
命令调用 schedule()的原因的任何具体答案,以及如果发生这样的事情,如何以标准方式解决错误!
答案 0 :(得分:5)
从技术上讲,调度方法是通过 Illuminate \ Foundation \ Console \ Kernel 的构造函数调用的(这是app \ Console \ Kernel.php的父类)
因此,每次实例化控制台内核时,都会执行schedule()方法。
让我们看看在哪种情况下执行了什么($ 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');
});
}
嗯,显然 php工匠日程表:运行本身就是一个控制台命令。所以它肯定需要有关预定命令的信息。
其他命令也可能需要有关已调度命令的信息...例如,如果您要编写工匠命令 list:scheduledTasks 。此命令将要求已将所有已调度的命令添加到控制台计划列表中。
可能还有其他几个(内部)参数,为什么每次都要运行调度函数。 (我没有深入挖掘源代码......)
然而......有关预定命令的信息可能对各种用例有用。
答案 1 :(得分:1)
您的错误是表$ pcregrep -M "^.*$\n\d+" text.txt
Checking log log0.txt
12
Checking log log2.txt
34
56
78
Checking log log5.txt
90
,而您的逻辑是dc_user_meta
user_meta
Schema::hasTable('dc_user_meta')
答案 2 :(得分:0)
我确信数据库中不存在表dc_user_meta。
答案 3 :(得分:0)
据我所知,你有桌子" user_meta"不是" dc_user_meta"但是你已经编写了代码来使用表" dc_user_meta"因此有一个错误说" dc_user_meta"找不到桌子。
答案 4 :(得分:-1)
如果有人仍然在乎这个...
<?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...
}
}
}