Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 6的多态性关系_Php_Laravel_Eloquent_Polymorphism_Entity Relationship - Fatal编程技术网

Php Laravel 6的多态性关系

Php Laravel 6的多态性关系,php,laravel,eloquent,polymorphism,entity-relationship,Php,Laravel,Eloquent,Polymorphism,Entity Relationship,我有一个问题,我正试图解决我自己的几个小时,但我没有找到一个适当的解决方案-所以我需要你的综合脑力;) 我有一个游戏管理Laravel应用程序,它应该为以下实体提供通用消息系统: 性格 恶棍 每个用户可以有未知数量的角色和恶棍 消息传递系统应将每个实体相互连接,这意味着连接可以如下所示: 字符-->字符 角色-->恶棍 恶棍-->角色 恶棍-->恶棍 显然,角色和反派在《拉威尔》中是不同的口才模型 为了更好的概述,我想开发一个邮件收件箱,像一个webmailer,显示所有角色和恶棍的所有

我有一个问题,我正试图解决我自己的几个小时,但我没有找到一个适当的解决方案-所以我需要你的综合脑力;)

我有一个游戏管理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表中,并相应地对它们进行种子测试。