Laravel 延迟加载优化

Posted

技术标签:

【中文标题】Laravel 延迟加载优化【英文标题】:Laravel lazy load optimisation 【发布时间】:2014-08-31 18:05:19 【问题描述】:

我想用一个查询加载我所有的 cmets,现在我有论坛主题和回复以及两者的 cmets,所以我渴望单独加载 cmets。

$threads = Thread::with('comments');
$replies = Reply::with('comments');

可能是这样的:

Comment::loadFor([$threads, $replies]);

【问题讨论】:

$cmets = Comment::with(['forum', 'reply'])->get();按照下面@werewolf 的示例了解如何设置关系。还请务必阅读有关关系的文档,因为它都在那里。 你不能通过使用 Eloquent 方法的单个查询来做到这一点,因为它为每个关系执行单独的查询。在您的情况下,优化将是缓存。 【参考方案1】:

如果您在 Comment 模型中声明了两者的关系,那么您可以试试这个:

$comments = Comment::with('threads', 'replies')->get();

在这种情况下,您需要在Comment 模型中创建关系方法,即threadsreplies,例如:

public function replies()

    return $this->hasMany('Reply', 'comment_id', 'id'); // Could be different


public function threads()

    return $this->hasMany('Thread', 'comment_id', 'id'); // Could be different

【讨论】:

我明白了,从后面走。不行,我要先找到线程! 嗯,我需要先找到线程,然后获取它的关系。问题是 cmets 表查询了两次,我认为它已经足够好了。如果有一种方法可以减少查询,那就太好了。 能否请您提供您的关系方式,它们是如何相互关联的。

以上是关于Laravel 延迟加载优化的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 从 vue 文件中混合延迟加载组件

Laravel 延迟加载的问题

八 Hibernate延迟加载&抓取策略(优化)

延迟加载模块中的角度延迟加载模块

Hibernate的抓取策略(优化)

Laravel Service Provider 开发时设置延迟加载时遇到的问题