计划每周将 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
- 使用 cron
直接 运行 命令
crontab -e
并将以下脚本添加到服务器上的 crontab 文件中:
0 1 * * 6 cd /var/www/your-project && php artisan routeschedule:weekly >> /dev/null 2>&1
你可以测试crontab脚本here
在Windows中使用任务计划程序
或
- 运行 与
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
运行 每分钟执行一次
我打算做一个每周的任务调度,就是把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
- 使用 cron 直接 运行 命令
crontab -e
并将以下脚本添加到服务器上的 crontab 文件中:
0 1 * * 6 cd /var/www/your-project && php artisan routeschedule:weekly >> /dev/null 2>&1
你可以测试crontab脚本here
在Windows中使用任务计划程序
或
- 运行 与
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
运行 每分钟执行一次