2015-09-28 39 views
2

我有一個Laravel工作,我派遣從文件讀取客戶數據。該作業具有記錄器模型依賴性,並且該記錄器跟蹤某些統計信息,然後在作業完成時寫入日誌數據庫表。當我派遣這項工作,立即它工作正常,但如果我排隊完全相同的工作具有完全相同的參數,然後從隊列中運行它,它失敗,出現錯誤:Laravel 5.1工作如果立即工作,但由於雄辯模型錯誤排隊等待失敗

[Illuminate\Database\Eloquent\ModelNotFoundException]    
    No query results for model [app\Models\MyModel]. 

我認爲這是由於序列化/反序列化Laravel隊列系統中固有的破壞Eloquent的本質,當我從未真正嘗試在db中找到某些東西時嘗試findOrFail()方法。我只是從空白模型創建一個新的日誌。無論如何,很顯然,同樣的Laravel工作在沒有排隊的情況下運行良好 - 但在排隊時失敗。我不知道是否有辦法解決這個問題。

謝謝。

+0

你可以添加你所有的代碼嗎? 'dispatch'函數調用隊列作業和Job本身? – benjah

回答

-2

使一個錯誤處理程序(把它放在你的路由)

App::error(function(Illuminate\Database\Eloquent\ModelNotFoundException $e) 
{ 
    return Response::make('Not found',404); 
}); 
+0

這從數據庫隊列中作爲一個作業運行,而不是作爲一個網頁。 –

+0

我很抱歉。請不理我的答案。謝謝 – Ponce

2

我工作圍繞它通過實例,然後傳遞到作業的構造函數之前保存模型對象,因此它至少有一個主鍵組。這消除了findOrFail()方法。一點點哈克,但這是我能想到的最好的。

+1

這是做到這一點的唯一方法,沒有什麼黑客。請記住隊列工作者/監聽者已經在後端引導了它自己的框架副本,因此它不會訪問任何你傳遞給它的雄辯對象,除非你先調用 - > save()。如果您使用「同步」隊列驅動程序進行測試,但在生產中使用真正的隊列,則這是一個容易犯的錯誤。 – ShaunUK

+0

從我的測試中看來,在排隊作業的構造函數中實例化新的雄辯模型會調用findOrFail()並將其分解。所以我可以在作業之前保存()它並傳入。但是我也可以將完全相同的代碼移動到handle()方法並實例化一個新的雄辯模型,並且這也起作用。所以還有另一種可能的解決方案 –

+0

我認爲我面臨與您的問題相同的問題。 我試圖在'handle()'方法內進行更新,但是每當我嘗試在'handle()'方法內執行數據庫調用時,隊列都會一直循環。你是否設法在'handle()'方法中做任何更新? – Seeya