gpt4 book ai didi

php - 带有约束的预加载会生成太多查询。我该如何缓解呢?

转载 作者:搜寻专家 更新时间:2023-10-31 21:21:55 27 4
gpt4 key购买 nike

我有 4 个在数据库和模型中相关的表,如下所示:

Users (hasMany(communities), hasMany(comments), hasMany(submissions))
Communities (belongsTo(user), hasMany(submissions))
Submissions (belongsTo(community), belongsTo(user), hasMany(comments))
Comments (belongsTo(user) , belongsTo(submission))

现在。如果我使用关系来获取,比如 25 个最新提交,如下所示:

$submissions = Submission::simplePaginate(25);

在使用 foreach 循环遍历结果后,我遇到了 76 个查询运行。

如果我对以下内容使用预加载

$submissions = Submission::with(['user', 'community', 'comments'])->simplePaginate(25);

我遇到了 4 个最佳查询(我认为)。

现在,我的问题是,在社区上,我有一个名为 active 的数据库字段,它接受 1 表示活跃社区,0 表示不活跃。正如您可能已经猜到的那样,前面的查询会返回所有内容,包括不活跃的社区。

我想到了急切加载约束,所以我使用了以下内容:

$submissions = Submission::with([
'community' => function($query) {
$query->active();
}
]
)->with(['user', 'comments'])->simplePaginate(25);

这仍然可以完成 4 个查询的工作,但现在我遇到了另一个问题。此方法过滤不活跃的社区,但仍加载帖子、用户和评论。现在我得到的结果是我从不活跃的社区获得帖子。

最后,在阅读这个社区后,我尝试了以下内容:

   $submissions = Submission::whereHas(
'community', function($query) {
$query->active();
}
)->with(['user', 'comments'])->simplePaginate(20);

因此,我没有使用 ->with(),而是使用了有人建议的 ->whereHas()。然而,虽然这会产生正确的结果,即它只为我提供来自活跃社区的帖子、评论和用户,但根据我从 Laravel Debugbar 获得的反馈,它现在在 23 个查询中这样做。

这正常吗?这是我可以通过 Eloquent 而无需编写带有连接的自定义查询的唯一方法吗?我是否夸大了 23 个查询?

如有任何帮助,我们将不胜感激。

最佳答案

你的问题是 active()范围正在为您正在检索的每个社区运行查询,在您的例子中是 20 个。

要对此进行优化,您可以在 Submission 中建立特定关系主动过滤活跃社区的模型。

// Submission model

public function activeCommunities (){

return $this->hasMany(Community::class)->whereActive(true);
}

现在您的查询如下所示:

$submissions = Submission::with(['user', 'comments', 'activeCommunities])  
->simplePaginate(25);

我相信这应该执行 4 个查询。

希望对你有帮助。

关于php - 带有约束的预加载会生成太多查询。我该如何缓解呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45703008/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com