2017-05-28 38 views
0

我創造了我傳遞了一個模型來通知:未將關係傳遞給通知?

class NewMessage extends Notification implements ShouldQueue 
{ 
    use Queueable; 

    protected $message; 

    public function __construct(Message $message) 
    { 
     $this->message = $message; 
    } 

    public function via() 
    { 
     return ['database']; 
    } 

    public function toArray() 
    { 
     Log::info($this->message); 

     return [ 
      'message_id' => $this->message->id, 
     ]; 
    } 
} 

這是我如何打電話通知:

$message = Message::where('user_id', Auth::user()->id) 
    ->where('message_id', $message_id) 
    ->with('topic') 
    ->get(); 

$user->notify(new NewMessage($message)); 

的問題是,當通知打印日誌(Log::info($this->message);) ,topic關係不顯示。

然而,我發現,如果我改變toArray()功能在nofitication類此,它打印出罰款:

public function toArray() 
{ 
    $this->message->topic; 

    Log::info($this->message); 

    return [ 
     'message_id' => $this->message->id, 
    ]; 
} 

爲什麼?我該如何解決?

+0

這有些古怪。 'with'確實根據文檔進行熱切加載,'load'進行延遲加載。你可以用('topic')''加載('topic')'而不是' - >嗎?看起來像'toArray'不尊重渴望加載的關係。 –

+0

剛試過' - >加載('topic')'。同樣的問題。 :/ – applestopears

+0

事實上,laravel給出了一個集合,所以你需要使用集合而不是簡單的數組 – lewis4u

回答

0

您的通知設置爲排隊,並且您要擴展的Notification類使用SerializesModels特質。當具有SerializesModels特徵的對象被序列化以放入隊列時,該對象上包含的任何模型(例如,您的消息)將被替換爲該模型的ID(消息ID)。當隊列工作者將您的通知反序列化以處理它時,它將使用該消息標識從數據庫重新檢索消息。不幸的是,當發生這種情況時,不包括任何關係。

因此,即使消息在序列化時加載了主題關係,它在隊列工作者處理通知時也不會加載主題關係。如果您需要通知內的主題,則需要重新加載它,如您所見。

你可以在documentation here瞭解更多。相關部分引用如下:

在這個例子中,請注意,我們能夠直接將Eloquent模型傳遞給排隊作業的構造函數。由於該作業正在使用的SerializesModels特性,當作業正在處理時,雄辯模型將被優雅地序列化和非序列化。如果您的排隊作業在其構造函數中接受了Eloquent模型,則只有模型的標識符將被序列化到隊列中。實際處理作業時,隊列系統將自動從數據庫中重新獲取完整模型實例。這對您的應用程序來說都是完全透明的,並且可以防止序列化完整的Eloquent模型實例時可能出現的問題。

相關問題