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
模型中创建关系方法,即threads
和replies
,例如:
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 延迟加载优化的主要内容,如果未能解决你的问题,请参考以下文章