2017-06-21 41 views
0

我有一個項目,其中每個客戶端都有一個唯一的子域和他們自己的數據庫。Laravel,beanstalkd和多個數據庫

我想使用Laravel的隊列處理作業併發送通知。但是,由於SerializesModels特徵僅序列化/反序列化模型ID,所以作業始終嘗試從主數據庫檢索數據,而不管哪個客戶端啓動作業。

有沒有一種方法可以指定數據庫連接?如果這不可行,我願意接受建議的替代工作流程。

從Laravel文檔:

雄辯車型將正常序列化,序列化時,在處理作業。如果您的排隊作業在其構造函數中接受了Eloquent模型,則只有模型的標識符將被序列化到隊列中。實際處理作業時,隊列系統將自動從數據庫中重新獲取完整模型實例。這對您的應用程序來說都是完全透明的,並且可以防止序列化完整的Eloquent模型實例時可能出現的問題。

實例:那麼分派作業從OrderController

dispatch(new SendEventSignupEmail($order)); 

正確的順序順序通過構造在作業類注射

public function __construct(Order $order) 
{ 
    // 
    $this->order = $order; 
} 

這是我的理解是模型id被提取並序列化併發送到句柄方法,在句柄中它是非序列化的,模型從數據庫中重新檢索。

public function handle() 
{ 
    Mail::to($this->order)->send(new EventSignup($this->order)); 
} 

的問題是,在這一點上,$這個 - >訂單實際上是一個不同的順序(或任務失敗),因爲serializesModels特徵檢索從默認的數據庫模型。

回答

0

SerializesModels特質是(在我看來)有點不直觀。正如你發現的那樣,它只是序列化ID,然後命中數據庫以重新水化對象。但是,爲了序列化模型,不需要該特徵。

刪除特徵,它應該作爲一個整體序列化對象,所以你的工作不必擊中數據庫來獲取它的數據。