为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信