首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Laravel 6中的多态关系

Laravel 6中的多态关系
EN

Stack Overflow用户
提问于 2019-12-12 22:31:30
回答 1查看 174关注 0票数 1

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

我有一个游戏管理Laravel应用程序,它应该为以下实体提供一个通用消息传递系统:

  • Character
  • Villain

每个用户都可以有一个未知数量的字符和恶棍。

消息传递系统应该将每个实体连接起来,这意味着连接可以如下所示:

-> Character

  • Character -> Villain

  • Villain --> Character

  • Villain -->反派

显然,角色和恶棍是不同的雄辩的拉勒维尔模式。

为了更好地概述,我想开发一个消息收件箱,像一个网络邮件,显示来自所有字符和恶棍的所有消息组合。

我的想法是创建多态一对多的关系,并在消息模型中添加两个形态:

代码语言:javascript
复制
public function sender ()
{
    return $this->morphTo();
}

public function recipient ()
{
    return $this->morphTo();
}

角色和反派模特儿也有两种形态,每种形态如下:

代码语言:javascript
复制
public function receivedMessages()
{
    return $this->morphMany('App\Models\Message', 'recipient');
}

public function sentMessages()
{
    return $this->morphMany('App\Models\Message', 'sender');
}

My messages表包含在迁移过程中使用以下方法创建的多形性关系所需的字段:

代码语言:javascript
复制
$table->morphs('sender');
$table->morphs('recipient');

因此,在我的想法中,我可以简单地查询特定用户的所有消息,其中包括所有字符和所有恶意消息。从这个消息列表中,我应该能够检索到个人字符和恶意信息,如下所示:

代码语言:javascript
复制
@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

不幸的是,我似乎无法从消息对象中检索字符或恶意信息。如果我只是用:

代码语言:javascript
复制
$message->sender

结果为空。如果我用:

代码语言:javascript
复制
$message->sender()

结果不是null,但我仍然无法检索字符或反派实例的属性,例如:

代码语言:javascript
复制
$message->sender()->name

总是抛出一个BadMethodCallException。

你知道我哪里搞错了吗?我再也看不见树林了,我害怕的是树木。

任何帮助或投入都是非常感谢的!

谢谢大家,朱尔斯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-13 14:03:25

好吧,我想出了一个解决办法。

默认情况下,当您作为属性访问雄辩的关系时,关系的数据是延迟加载的。这意味着默认情况下它不会加载。

我预计这会像普通的延迟加载一样运行,这意味着当我访问属性时,它将自动加载关系,并允许我访问相关模型的属性。情况似乎并非如此。

当我在我的“信息”雄辩模型中添加以下一行时,我所做的一切都是完美的:

代码语言:javascript
复制
protected $with = ['sender', 'recipient'];

模型的受保护的"with“属性告诉用户在查询数据时应该加载哪些关系(而不是延迟加载)。添加发件人和收件人后,默认情况下将加载所有相关数据--不再懒惰--但它已加载。

在我看来,这种行为在Laravel6.7.0中可能是一个错误,我将在GitHub回购中报告这一点。

有关紧急加载的更多信息可以在这里找到:https://laravel.com/docs/6.x/eloquent-relationships#eager-loading

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59313637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档