将自定义字段添加到Laravel排队的作业记录中?

P. *_*lla 8 php laravel laravel-5

我有一个工作Laravel 5排队的工作类,使用'database'驱动程序称为'SendMyEmail'.数据库'jobs'表正确地填充了这样的调度作业.

我想在网站上显示这些作业,因此我想在构造这些作业记录时在名为"name"的自定义字段上添加和保存值.(我会将此名称作为参数传递给SendMyEmail类构造函数..)

有谁知道如何做到这一点?

Ste*_*ven 6

好吧,所以你想保留排队/处理过的工作的历史,对吧.

没有任何内置支持来自定义数据库字段.

看到:

https://github.com/laravel/framework/blob/7212b1e9620c36bf806e444f6931cf5f379c68ff/src/Illuminate/Queue/DatabaseQueue.php#L170

http://i.imgur.com/nFciWi9.png

根据我的理解,这种行为是有意的,因为你不应该真正搞乱原来的'工作'表.它被设计为无国籍的.这意味着作业记录在处理完毕后立即被删除.

如果您想跟踪您的工作(例如历史记录),您可能只需创建一个新的Eloquent模型并将其传递给您的工作构造函数.这很有用,可以保持原始作业和历史记录的同步.


好吧,让我们开始编码,好吗?

输入以下内容创建新迁移:

php artisan make:migration create_jobs_history_table

现在打开该迁移并添加以下列类型.

database/migrations/ 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

说明:

如您所见,我们添加了三个名为user_id,jobstatus的新类型 .

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 = [];

}
Run Code Online (Sandbox Code Playgroud)

甜.现在,我们可以轻松地在我们的应用程序中与我们的工作历


是时候创造一份工作了.让我们使用以下代码:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

说明:

这里我们包括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');
    }
}
Run Code Online (Sandbox Code Playgroud)

说明:

我们将现有用户和新作业历史记录传递给构造函数.之后我们派遣延迟的工作.

注意:延迟仅用于演示目的.

打开数据库并检查jobs_history表.调度作业后,相应历史记录的状态应为0.一旦工匠队列工作人员处理完作业,历史记录状态应为1.

我用Laravel 5.4测试了这个设置,我在我的应用程序中使用了相同的逻辑.

快乐的编码!