首页 > 解决方案 > Laravel Cron Job 未执行 Eloquent 查询

问题描述

我刚刚为我目前正在从事的 laravel 项目设置了一个 cron 作业。这是我命令中的句柄函数。

public function handle()
    {
        Log::info("PayoutList Cron started!");

        $tradersToPay = Investments::select('id', 'monthly_roi')
                    ->where(DB::raw('CURDATE()'), '<=', 'end_date')
                    ->where(DB::raw('DAY(CURDATE())'), '=', DB::raw('DAY(start_date)'))
                    ->where('status', '=', 2)
                    ->get();
        foreach ($tradersToPay as $payout){
            $row = [
                'investment_id' => $payout->id,
                'roi' => $payout->monthly_roi,
                #'created_at' => date('Y-m-d H:i:s')
            ];
            Payouts::create($row);
        }
        #$this->info('PayoutList Cron command executed successfully');
        Log::info("PayoutList Cron command executed successfully");
    }

我已安排此命令在每天午夜运行,它仅在日志文件中显示日志消息,这意味着命令已执行,但其间的查询不在我的 cpanel 上运行,而是在我的 Windows 本地服务器上运行。我需要这方面的帮助。

$schedule->command('payoutlist:cron')
                    ->dailyAt('02:30')
                    ->timezone('Africa/Lagos');

我的主机只允许在 cron 作业上设置它,它仍然可以正常工作

*/5 *   *   *   *   /usr/local/bin/php /directorty/artisan schedule:run >> /dev/null 2>&1

我正在使用 Laravel 5.8

标签: phplaravel

解决方案


问题源于这一行:

->where(DB::raw('CURDATE()'), '<=', 'end_date')

Laravel 期望第三个参数是一个值,所以它end_date作为字符串而不是列名传递。由于您没有传递任何实际值,因此将整个 where 转换为原始查询:

->whereRaw('CURDATE() <= end_date')

推荐阅读