亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Laravel 6 中的多態關系

Laravel 6 中的多態關系

PHP
開滿天機 2022-06-17 15:25:53
我有一個問題,我試圖自己解決幾個小時,但我找不到合適的解決方案 - 所以我需要你的綜合腦力;)我有一個游戲管理 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


查看完整回答
反對 回復 2022-06-17
  • 1 回答
  • 0 關注
  • 104 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號