计划每周将 Table A 的所有 ID 复制到 Table B,并在 Table B Laravel 中插入一个日期

Schedule to copy all id of Table A to Table B for weekly and insert a date to Table B Laravel

我打算做一个每周的任务调度,就是把tableroute_schedule的所有id复制过来插入tableroute_schedule_details as FK,然后将插入星期几。 route_schedule_details 架构是这样的:

Schema::create('route_scheduler_details', function (Blueprint $table) {
        $table->id();
        $table->dateTime('schedule_date')->nullable();
        $table->unsignedBigInteger('route_scheduler_mstr_id')->nullable()->index('FK_route_scheduler_details_route_scheduler_mstr');

        $table->foreign(['route_scheduler_mstr_id'], 'FK_route_scheduler_details_route_scheduler_mstr')->references(['id'])->on('route_scheduler_mstr')->onDelete('cascade');
    });

我以前从未使用过任务调度,所以我对这里有点了解。阅读 Laravel 文档,我必须在 App/Console/Kernel.php

中添加时间表
protected function schedule(Schedule $schedule)
{
    $schedule->call(function () {
        $data = [];
        $copies = RouteSchedulerMSTR::select('id')->get();
        foreach($copies as $copy){
            //I'm not sure what to do in here
        }

    })->weekly(1, '1:00');
}

首先,您需要创建命令,因为上面的代码无法测试工作与否:

php artisan make:command RouteSchedulerWeekly
<?php

namespace App\Console\Commands;

use App\Models\RouteSchedulerMSTR;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;

class RouteSchedulerWeekly extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'routeschedule:weekly';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Run route scheduler weekly';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return int
     */
    public function handle()
    {
        $copies = RouteSchedulerMSTR::select('id')->get();
        foreach($copies as $copy){
            DB::table('route_scheduler_details')->insert([
               'data' => now(),
               'route_scheduler_mstr_id' => $copy
            ]);
            $this->info('Route scheduler inserting...');
        }
        $this->info('Done!');
    }
}

然后你可以测试你的代码插入与否:

php artisan routeschedule:weekly

如果你想要的功能是正确的,你可以 运行 通过带有 2 个选项的 cronjob

  1. 使用 cron
  2. 直接 运行 命令
crontab -e

并将以下脚本添加到服务器上的 crontab 文件中:

0 1 * * 6 cd /var/www/your-project && php artisan routeschedule:weekly >> /dev/null 2>&1

你可以测试crontab脚本here

在Windows中使用任务计划程序

  1. 运行 与 schedule:run

Kernel

中添加您的命令
class Kernel extends ConsoleKernel
{
    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('routeschedule:weekly')->weekly(1, '1:00');
    }
}

并将以下脚本添加到服务器上的 crontab 文件中:

* * * * * cd /var/www/your-project && php artisan schedule:run >> /dev/null 2>&1

这里* * * * *是每分钟

结论:我推荐选项 1,它每周 运行 在您的服务器上一次。选项 2 也 运行 每周执行一次您的命令,但 schedule:run 运行 每分钟执行一次