我有一个问题,我试图自己解决几个小时,但我找不到合适的解决方案 - 所以我需要你的综合脑力;)
我有一个游戏管理 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。
有什么想法我弄错了吗?我不再只见我害怕的树木。
江户川乱折腾