如何渴望加载多态关系的不同嵌套关系?

Posted

技术标签:

【中文标题】如何渴望加载多态关系的不同嵌套关系?【英文标题】:How to eager load different nested relationships of polymorphic relationships? 【发布时间】:2020-04-12 05:36:04 【问题描述】:

我正在尝试获取用户的所有评论及其事件。 我在 Review 中有一个多态关系:它可以链接到 Estimate 或 EventDate。 EventDate 直接链接到 Event,而 Estimate 通过 AskEstimate 链接到它。

我想这样做:

User::with([
   'reviews.reviewable.event',
   'reviews.reviewable.ask_estimate.event'
])->get();

当然它会抛出一个异常:当reviewable是一个EventDate时,它没有任何AskEstimate关系,当它是一个Estimate时,它没有任何Event关系。

那么,根据可审查的价值,我怎样才能得到一个给我一个或另一个的东西呢?

谢谢!

编辑:

这是一个工作版本。

Review::where('user_id', $user->id)
            ->with([
                'reviewable',
                ])
            ->loadMorph('reviewable', [
                Estimate::class => ['ask_estimate'],
                EventDate::class => ['event'],
            ]);

【问题讨论】:

【参考方案1】:

感谢德莱娜的回答。

根据the doc的说法,我认为loadMorph必须这样使用:

User::with('reviews.reviewable')
            ->limit(1)
            ->get()
            ->loadMorph('reviews.reviewable', [
                Estimate::class => ['ask_estimate.event'],
                EventDate::class => ['event'],
            ]);

但是有了这个我只得到reviews.reviewable的结果,我没有得到任何事件或ask_estimate,就像loadMorph没用一样。

【讨论】:

不知道添加了这个方法【参考方案2】:

文档中的Nested Lazy Eager Loading & morphTo 部分似乎几乎准确地描述了您要查找的内容。它会“延迟”加载而不是加载,但我想这已经足够接近了。

根据我对文档的理解,您应该可以像这样使用 loadMorph 方法:

User::with('reviews')->get()
   ->loadMorph('reviews', [
       Estimate::class => ['event'],
       EventDate::class => ['ask_estimate.event'],
    ]);

【讨论】:

以上是关于如何渴望加载多态关系的不同嵌套关系?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent:渴望加载多个嵌套关系

如何渴望对同一张表加载多个belongsTo关系?

Laravel 渴望加载数据透视表关系

渴望/延迟加载的成员总是为空,JPA 一对多关系

渴望加载 Laravel 5 与两个外键的多对多关系

渴望加载与 Kaminara 分页的多态关联