我使用'database'驱动程序有一个名为'SendMyEmail'的Laravel 5排队作业类。数据库'jobs'表正确地填充了这样的调度作业。
我想在网站上显示这些作业,因此我想在构建这些作业记录时在名为“name”的自定义字段上添加和保存值。 (我会将此名称作为参数传递给SendMyEmail类构造函数。)
有谁知道怎么做?
答案 0 :(得分:6)
好的,所以你想保留排队/处理过的工作的历史,对吧。
没有任何内置支持来自定义数据库字段。
请参阅:
根据我的理解,这种行为是有目的的,因为你不应该把原来的工作弄得一团糟'。表。它被设计为无国籍的。这意味着就业记录在处理后立即被移除。
如果您想跟踪您的工作(例如历史记录),您可能只需创建一个新的Eloquent模型并将其传递给您的工作构造函数。这很有用,可以保持原始作业和历史记录的同步。
好吧,让我们开始编码,不管吗?
输入以下内容创建新迁移:
php artisan make:migration create_jobs_history_table
现在打开该迁移并添加以下列类型。
数据库/迁移/ xyz_create_jobs_history_table :
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateJobsHistoryTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('jobs_history', function(Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedInteger('user_id');
$table->string('job', 40);
$table->integer('status')->default(0);
$table->timestamps();
if (Schema::hasColumn('users', 'id'))
{
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
}
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::disableForeignKeyConstraints();
Schema::dropIfExists('jobs_history');
Schema::enableForeignKeyConstraints();
}
}
说明:
如您所见,我们添加了三种称为的新类型 user_id ,作业和状态。
user_id 引用用户的实际ID。
作业字段只是作业的说明/名称。
状态字段代表状态。 0 =尚未执行,1 =完成
现在我们已经准备好了迁移,让我们为它定义一个新模型:
app / JobHistory.php
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class JobHistory extends Model
{
protected $table = 'jobs_history';
protected $hidden = [];
}
甜。现在,我们可以在应用程序中轻松地与我们的工作历史进行交互。
是时候创造一份工作了。我们可以使用以下代码:
app / Jobs / ProvisionUser.php
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\User;
use App\JobHistory;
class ProvisonUser implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
protected $history;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(User $user, JobHistory $history)
{
$this->user = $user;
$this->history = $history;
// Set up our new history record.
$this->history->user_id = $this->user->id;
$this->history->job = 'Provison User';
$this->history->status = 0;
$this->history->save();
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// Do other stuff here....
// Once the job has finished, set history status to 1.
$this->history->status = 1;
$this->history->save();
}
}
<强>解释强>
这里我们包含了User和JobHistory模型。 在我们的构造函数中,我们需要两个模型,然后我们设置一个新模型 历史记录。
现在,实际工作与我们的新历史记录同步!
好。
在处理作业时调用handle()
函数。
这里我们将状态设置为1,一旦完成。
最后只需在您的控制器中发送作业:
<?php
namespace App\Http\Controllers;
use Carbon\Carbon;
use App\User;
use App\JobHistory;
use App\Jobs\ProvisionUser;
class SomeController extends Controller
{
public function provision()
{
$user = User::find(1);
$job = (new ProvisionUser($user, new JobHistory))
->delay(Carbon::now()->addMinutes(1));
dispatch($job);
return view('provision');
}
}
<强>解释强>
我们将现有用户和新作业历史记录传递给构造函数。后 我们派遣延迟工作。
注意:此延迟仅用于演示目的。
打开您的数据库并检查您的jobs_history表。调度作业后,相应历史记录的状态应为0.一旦工匠队列工作人员处理完作业,历史记录状态应为1.
我使用Laravel 5.4测试了这个设置,并且在我的应用程序中使用了相同的逻辑。
快乐的编码!
答案 1 :(得分:0)
请为失败的工作尝试此代码。
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\User;
use App\JobHistory;
class ProvisonUser implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
protected $user;
protected $history;
protected $id;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(User $user, JobHistory $history)
{
$this->user = $user;
$this->history = $history;
// Set up our new history record and get unique id
$this->id = DB::table('jobs_history')->insertGetId([
'user_id' => $this->user->id,
'job' => 'Provison User',
'status' => 0
]);
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
// Do other stuff here....
try{
$JobHistory = JobHistory::findOrfail($this->id);
// Once the job has finished, set history status to 1.
$JobHistory->status = 1;
$JobHistory->save();
}catch (\Exception $e){
// failed job, set history status to 1.
$JobHistory->status = 2;
$JobHistory->save();
}
}
public function failed()
{
$JobHistory = JobHistory::findOrfail($this->id);
// failed job, set history status to 1.
$JobHistory->status = 2;
$JobHistory->save();
}
}
就我而言,此代码有效。