2015-10-07 69 views
3

我想從它的官方文檔中學習laravel數據庫隊列。我已經完成了文檔中給出的配置。Laravel 5.1沒有關於排隊模型的查詢結果

這裏我的工作:

<?php 

namespace App\Jobs; 

use App\SearchLog; 
use App\Jobs\Job; 
use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Bus\SelfHandling; 
use Illuminate\Contracts\Queue\ShouldQueue; 

class SendTicket extends Job implements SelfHandling, ShouldQueue 
{ 
    use InteractsWithQueue, SerializesModels; 

    protected $log; 

    protected $searchLog = array(); 



    public function __construct(SearchLog $log , $data = array()) 
    { 
     $this->log = $log; 
     $this->searchLog = $data; 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle() 
    { 

     $this->log->create($this->searchLog);  
    } 

在我的控制器我這樣調用

public function store(Request $request) 
{ 
$searchLog = array(); 
// searchLog contains the data to be inserted into database 
$log = new SearchLog(); 
$this->dispatch(new SendTicket($log , $searchLog)); 
} 

當我運行php artisan queue:listen我得到這樣

錯誤

[照亮\數據庫\ Eloquent \ ModelNotFoundException]沒有查詢 模型[App \ SearchLog]的結果。

但是,當我編輯的職位像這樣

//only edited code 
public function __construct($data = array()) 
{ 
    $this->searchLog = $data; 
} 

/** 
* Execute the job. 
* 
* @return void 
*/ 
public function handle() 
{ 
    SearchLog::create($this->searchLog); 
} 

當從這樣的

public function store(Request $request) 
{ 
    $searchLog = array(); 
    // searchLog contains the data to be inserted into database 
    $this->dispatch(new SendTicket($searchLog)); 
} 

調用它工作正常,並插入數據。
在這裏,我的問題是:

  1. 如何將對象發送到隊列中?
  2. 將數據發送到隊列以便我們可以處理的最佳方式是什麼?
+0

這Laravel行爲是意外這麼多的人,所以我很高興地看到,有是一個相關的錯誤報告在這裏:https://github.com/laravel/framework/issues/14526 – Ryan

回答

0

我遇到了同樣的問題。

看起來如果你想將模型推送到隊列中,只有它的ID將被保存在有效載荷中。所以,如果你還沒有保存模型,它不會在處理程序中可用。

畢竟我在documentation的章節Queues and Eloquent Models中找到它。

爲了解決這個問題,我看到兩個方案,第一就是要確保你有一個持久的型號:

public function store(Request $request) 
{ 
$searchLog = array(); 
// searchLog contains the data to be inserted into database 
$log = new SearchLog(); 
//Save the Searchlog beforehand if it doesn't have any data constraints 
$log->save(); 
//Dispatch the Job with the saved Model 
$this->dispatch(new SendTicket($log , $searchLog)); 
} 

把完整的模型保存過程中的處理程序而已,就像你在你的例子中做了。

//Full saving/initializing is happening here 
public function handle() 
{ 
    SearchLog::create($this->searchLog); 
} 

在我而言,我不得不模型保存到一個高性能的過程數據庫,所以我把它完全在我的過程是不依賴於數據庫保存速度的處理程序。所以我會把它放在handle()函數中。

2

問題出在use Illuminate\Queue\SerializesModels;,它試圖序列化傳遞給構造函數的SearchLog $log參數。由於您的模型尚未保存,因此它沒有標識符。

根據Laravel文檔:

如果排隊的作業接受其構造雄辯的模型中,只有 爲模型標識將被序列化到隊列中。當 實際處理作業時,隊列系統將自動從數據庫中重新檢索完整模型實例 。

的解決方法是從作業類你願意保存模型中刪除SerializesModels特質。

+0

https://stackoverflow.com/a/42981667/470749是一個相關的問題,幫助我。 – Ryan