gpt4 book ai didi

php - Laravel - 多少查询太多了?

转载 作者:行者123 更新时间:2023-12-05 07:19:31 26 4
gpt4 key购买 nike

我有一个 laravel 网站,它列出了与 reddit 非常相似的“提交”。我用这个例子来更容易理解这个问题。

enter image description here例如,当用户访问主页时,他会看到列出了 30 个提交。

每次提交都代表大量信息。当然有来自提交本身的信息,比如标题和诸如此类的东西。但是有诸如“保存”之类的东西。对于每个提交,必须有一个查询来查看该用户是否还没有保存提交,否则它会显示“未保存”。

Blade :

@if (!Auth::user()->hasSavedSubmission($submission))
<a href="{{ route('save.submission', ['ID' => $submission->id, 'token' => $submission->token]) }}">Save</a>
@else
<a href="{{ route('unsave.submission', ['ID' => $submission->id, 'token' => $submission->token]) }}">Unsave</a>
@endif

用户模型:

 public function hasSavedSubmission(Submission $submission) {
return (bool) $submission->savedSubmissions->where('user_id', $this->id)->count();
}

然后需要查询。但是不仅有 hasSavedSubmission,还有一个查询来查看用户是否赞成/反对提交,或者他们是否订阅了该子等。

在评论页面上情况更糟。假设我加载了一个包含 200 条评论的评论页面。那么,要查看您是否保存了评论或对评论进行了投票,每个评论有 2 个查询,总共有 400 个查询。

这正常吗?这是好的做法,还是我应该以某种方式对其进行优化以减少查询,以及如何进行优化?

最佳答案

很多查询本身并不坏,但在您的情况下,可以通过调整查询数据库的方式大大减少查询。当前,您分别查询每个提交的已保存提交,您可以对其进行更改,以便仅在一个查询中检索用户的所有已保存提交。

举个例子,你可以在你的 Controller 中做这样的事情:

$query = SavedSubmissions::where('user_id', Auth::user()->id);
$submissionsForUser = $query->get('id'); // only load columns you'll need also saves a bit
// Pass $submissionsForUser to your blade template

在你的 Blade 模板中

@if (!submissionsForUser->contains($submission->id)
<a href="{{ route('save.submission', ['ID' => $submission->id, 'token' => $submission->token]) }}">Save</a>
@else
<a href="{{ route('unsave.submission', ['ID' => $submission->id, 'token' => $submission->token]) }}">Unsave</a>
@endif

或者,您可以将用于检索提交的逻辑移动到 User 模型,但这不是很干净。

其他减少查询量的方法是:

  • 对评论数量进行分页
  • 延迟加载评论(只显示前几条,带有“更多”按钮)
  • 调整您的数据库架构,以便您拥有特定 View 的非规范化数据(例如,1 个表包含 1 个 View 的所有数据)

关于php - Laravel - 多少查询太多了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57732450/

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