我有一個問題,我試圖自己解決幾個小時,但我找不到合適的解決方案 - 所以我需要你的綜合腦力;)我有一個游戲管理 Laravel 應用程序,它應該為以下實體提供通用消息傳遞系統:特點惡棍每個用戶可以有未知數量的角色和惡棍。消息系統應該將每個實體相互連接,這意味著連接可能如下:字符 --> 字符角色 --> 惡棍惡棍 --> 角色惡棍 --> 惡棍顯然 Characters 和 Villains 是 Laravel 中不同的雄辯模型。為了獲得更好的概覽,我想開發一個消息收件箱,例如網絡郵件程序,它顯示來自所有角色和惡棍的所有消息。我的想法是創建多態的一對多關系并向消息模型添加兩個變形:public function sender (){ return $this->morphTo();}public function recipient (){ return $this->morphTo();}而角色和反派模型也有兩個變體,每個都像:public function receivedMessages(){ return $this->morphMany('App\Models\Message', 'recipient');}public function sentMessages(){ return $this->morphMany('App\Models\Message', 'sender');}我的消息表包含多態關系的必填字段,在遷移期間使用以下命令創建:$table->morphs('sender');$table->morphs('recipient');所以在我的想法中,我可以簡單地查詢特定用戶的所有消息,其中包括所有角色和所有惡棍消息。從該消息列表中,我應該能夠檢索到各個角色和惡棍信息,就像這樣:@foreach($receivedMessages as $message) @if($message->sender() instanceof \App\Models\Character) // Do something character specific @endif @if($message->sender() instanceof \App\Models\Villain) // Do something villain specific @endif@endforeach不幸的是,我似乎無法從消息對象中檢索到角色和反派信息。如果我只是使用:$message->sender結果為null。如果我使用:$message->sender()結果不為空,但我仍然無法檢索角色或反派實例的屬性,例如:$message->sender()->name總是會拋出一個 BadMethodCallException。有什么想法我弄錯了嗎?我不再只見我害怕的樹木。
1 回答

江戶川亂折騰
TA貢獻1851條經驗 獲得超5個贊
好吧,我想出了一個解決方案。
默認情況下,當您將 eloquent 關系作為屬性訪問時,關系的數據是延遲加載的。這意味著默認情況下不加載它。
我希望這表現得像一個常見的延遲加載,這意味著當我訪問屬性時,它會自動加載關系并讓我訪問相關模型的屬性。情況似乎并非如此。
一旦我將以下行添加到我的“消息”雄辯模型中,我上面所做的一切都完美無缺:
protected $with = ['sender', 'recipient'];
模型的受保護“with”屬性告訴 eloquent 在查詢數據時應該預先加載(而不是延遲加載)哪些關系。添加發件人和收件人后,我的所有相關數據都默認加載 - 不再懶惰 - 但已加載。
在我看來,這種行為可能是 Laravel 6.7.0 中的一個錯誤,我將在 GitHub 存儲庫中報告這一點。
可以在此處找到有關預加載的更多信息:https ://laravel.com/docs/6.x/eloquent-relationships#eager-loading
- 1 回答
- 0 關注
- 104 瀏覽
添加回答
舉報
0/150
提交
取消