2015-10-02 10 views
5

'Veritabanı' sürücüsünü kullanarak 'SendMyEmail' adlı bir Laravel 5 sıralı iş sınıfı var. 'İşler' tablosu veritabanı, bu tür gönderilen işlerle doğru şekilde doldurulur.Laravel sıraya alınmış iş kayıtlarına özel alan ekleyin?

Bu işleri bir web sitesinde göstermek istiyorum ve bu nedenle, oluşturulduklarında bu iş kayıtları üzerinde 'ad' adlı özel bir alana bir değer eklemek ve kaydetmek istiyorum. (Bu adı SendMyEmail sınıf yapıcısına bir parametre olarak iletirdim.)

Bunu nasıl yapacağını bilen var mı?

cevap

2

Pekala, kuyruğa/işlenmiş işlerin geçmişini tutmak istediğinizde, doğru.

Veritabanı alanlarını özelleştirmek için yerleşik destek yok.

bakınız: Benim anlayış

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

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

bu davranış amaçlanan, çünkü orijinal 'jobs' tabloyla gerçekten berbat etmemeliyiz. Vatansız çalışmak için tasarlandı. Bu, bir iş kaydının işlendikten hemen sonra kaldırıldığı anlamına gelir.

İşlerinizi takip etmek istiyorsanız (örneğin geçmiş), yeni bir Eloquent modeli oluşturabilir ve iş yapıcınıza iletebilirsiniz. Bu orijinal işi ve geçmişinizi senkronize etmek için kullanışlıdır.


Tamam, kodlamaya başlayalım mı? Şimdi göç create_jobs_history_table

o göç açıp aşağıdaki sütun türlerini ekleyin:

php esnaf marka:

girerek yeni göç oluşturun.

veritabanı/göçler/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(); 
    } 
} 

Açıklama: Gördüğünüz gibi

, biz user_id denilen üç yeni tip eklendi, ve durumu.

user_id, bir kullanıcının gerçek kimliğine başvurur.

alan, yalnızca bir iş tanımı/adıdır.

durum saha durumunu temsil eder.

app/JobHistory.php

: 0 henüz proccessed 1 = Şimdi göç hazır olduğunu

Yapılmadı = bize bunun için yeni bir model tanımlayalım
<?php 

namespace App; 

use Illuminate\Database\Eloquent\Model; 

class JobHistory extends Model 
{ 
    protected $table = 'jobs_history'; 

    protected $hidden = []; 

} 

Sweet. Artık uygulamamızdaki iş geçmişimizle kolayca etkileşime geçebiliriz.


Bir iş oluşturma zamanı. en aşağıdaki kodu kullanarak bunu yapalım:

Burada dahil kullanıcı ve JobHistory modeller:

<?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(); 
    } 
} 

Açıklama

uygulama/İş/ProvisionUser.php. Kurucumuzda her iki modele de ihtiyacımız var ve yeni bir tarih kaydı oluşturduk.

gerçek iş

şimdi bizim yeni geçmiş kayıtla eşitlenir!

iyi. iş işlenirken

handle() fonksiyon denir. Burada, tamamlandığında durumu 1 olarak ayarlıyoruz.

Ve son olarak basitçe denetleyicisi işi sevk:

<?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'); 
    } 
} 

Açıklama:

Biz yapıcı olan bir kullanıcı ve yeni iş geçmişini geçmektedir. Gecikmeli işi gönderdiğimiz 'dan sonra.

Not: gecikme sadece halka sunum amaçlıdır.

senin veritabanını açın ve jobs_history tabloyu kontrol edin. İşiniz gönderilir gönderilmez, karşılık gelen tarih kaydının durumu 0 olmalıdır. Esnaf kuyruğu çalışanı işi işledikten sonra, geçmiş kayıt durumu 1 olmalıdır.

Bu kurulumu Laravel 5.4 ve I ile test ettim. Uygulamamda aynı mantığı kullan.

Mutlu kodlama!

+0

ben bununla başa ediyorum nasıl statü 2. başarısız bir iş koymak istiyorum? – cartbeforehorse

+0

Kendi sorumu yanıtlarken, tüm kodu "try {}" bloğundaki 'handle()' işlevine bütünüyle sardım, istisnaları yakaladım ve tarih durumunu 2'ye ayarladım. nasıl olsa yaparsın. – cartbeforehorse

+0

@cartbeforehorse Tam olarak böyle yapardım. – Steven

İlgili konular