Php Laravel 6的多态性关系
我有一个问题,我正试图解决我自己的几个小时,但我没有找到一个适当的解决方案-所以我需要你的综合脑力;) 我有一个游戏管理Laravel应用程序,它应该为以下实体提供通用消息系统:Php Laravel 6的多态性关系,php,laravel,eloquent,polymorphism,entity-relationship,Php,Laravel,Eloquent,Polymorphism,Entity Relationship,我有一个问题,我正试图解决我自己的几个小时,但我没有找到一个适当的解决方案-所以我需要你的综合脑力;) 我有一个游戏管理Laravel应用程序,它应该为以下实体提供通用消息系统: 性格 恶棍 每个用户可以有未知数量的角色和恶棍 消息传递系统应将每个实体相互连接,这意味着连接可以如下所示: 字符-->字符 角色-->恶棍 恶棍-->角色 恶棍-->恶棍 显然,角色和反派在《拉威尔》中是不同的口才模型 为了更好的概述,我想开发一个邮件收件箱,像一个webmailer,显示所有角色和恶棍的所有
- 性格
- 恶棍
- 字符-->字符
- 角色-->恶棍
- 恶棍-->角色
- 恶棍-->恶棍
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');
}
My messages(我的消息)表包含在迁移过程中使用以下方法创建的变形关系的必填字段:
$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
结果为空。如果我使用:
$message->sender()
结果不为空,但我仍然无法检索角色或恶棍实例的属性,例如:
$message->sender()->name
总是抛出一个BadMethodCallException
你知道我哪里弄错了吗?我不再为我所害怕的树木而看到树林
非常感谢您的任何帮助或意见
谢谢大家,,
朱尔斯好吧,我想出了一个解决办法 默认情况下,当您作为属性访问雄辩的关系时,该关系的数据是延迟加载的。这意味着默认情况下不会加载它 我希望它的行为类似于普通的延迟加载,这意味着当我访问属性时,它将自动加载关系,并允许我访问相关模型的属性。情况似乎并非如此 当我在我的“信息”雄辩模型中添加以下行时,我上面所做的一切都非常有效:
protected $with = ['sender', 'recipient'];
模型的protected“with”属性告诉Elounce在查询数据时应该加载(而不是延迟加载)哪些关系。通过添加发送者和接收者,默认情况下会加载所有与我相关的数据—不再是懒惰的—但它会被加载
在我看来,这种行为可能是Laravel6.7.0中的一个bug,我将在GitHub repo中报告这一点
有关快速加载的更多信息,请参见此处:
希望有帮助。好吧,我想出了一个解决办法 默认情况下,当您作为属性访问雄辩的关系时,该关系的数据是延迟加载的。这意味着默认情况下不会加载它 我希望它的行为类似于普通的延迟加载,这意味着当我访问属性时,它将自动加载关系,并允许我访问相关模型的属性。情况似乎并非如此 当我在我的“信息”雄辩模型中添加以下行时,我上面所做的一切都非常有效:
protected $with = ['sender', 'recipient'];
模型的protected“with”属性告诉Elounce在查询数据时应该加载(而不是延迟加载)哪些关系。通过添加发送者和接收者,默认情况下会加载所有与我相关的数据—不再是懒惰的—但它会被加载
在我看来,这种行为可能是Laravel6.7.0中的一个bug,我将在GitHub repo中报告这一点
有关快速加载的更多信息,请参见此处:
希望能有所帮助。您是否按照拉雷维尔公约创建了一个名称的领域?嗨@AlbertoSinigaglia,是的,我确实创建了。我将字段senderable_id和_type以及recipiented_id和_type添加到我的messages表中,并相应地为它们设定种子进行测试。您是否按照laravel约定创建了名称为的字段?您好@Albertosinaglia,是的,我确实创建了。我将字段senderable_id和_type以及recipientable_id和_type添加到我的messages表中,并相应地对它们进行种子测试。