gpt4 book ai didi

php - Laravel - 在 Blade 中加载更多结果时如何避免 N+1 问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:49:00 25 4
gpt4 key购买 nike

我正在构建一个包含提交内容的网站,这些提交内容包含评论。这些评论的结构很像 reddit 的。这是一张供引用的图片:

enter image description here

这些评论有很多关系(授权用户是否保存/赞成/反对评论,评论是否有 child ,谁创建了评论)。

因此,为了避免一堆不必要的服务器查询,我急于加载这些关系。

$comments = Comment::with(['children','owner','savedComments','votes'])
->where('submission_id', $submission->id)
->where('parent_id', NULL)
->orderBy('removed','asc')
->orderBy($sortBy, $direction)
->paginate(200);

然后我在 View 中foreach 这些评论。但是,请注意在我的查询中我只加载了父评论。

对于 child ,我通过评论的 children 关系用 foreach 加载他们。

评论.php:

public function children() {
return $this->hasMany('App\Comment','parent_id')->orderBy('total_score', 'desc');
}

comment_block.blade.php:

@foreach ($comment->children as $comment)
@if ($loop->depth == 10)
<div>
<a href="{{ route('get.submission', ['subchan' => $submission->subchan, 'id' => $submission->id, 'URLtitle' => $submission->URL_title,'commentID' => $comment->parent_id]) }}">Continue this thread</a>
</div>
@break
@elseif ($loop->iteration == 8 && $totalComments >= 25)
<div class="loadMoreReplies"
data-submission-id="{{ $submission->id }}"
data-parent-id="{{$comment->parent_id}}"
>Load More Replies (<span id="remaining-reply-count-{{$comment->parent_id}}">{{ $loop->remaining + 1 }}</span>)</div>
@break
@else
<div class="comment-container comment-container-child" id="comment-container-{{$comment->id}}">
@include('partials.comment_block')
</div>
@endif
@endforeach

问题在于,尽管父评论关系被急切加载,但每个子评论也会引起查询,因为它们是通过关系加载到 View 中的。所以我的服务器查询总数从一个增加到可能的数百个。

我该如何解决这个问题?

编辑:

对于那些说我没有 n+1 问题的人,这些是我在不加载子评论时的查询:

enter image description here

这是我加载子评论的时候: enter image description here

我也用 laravel query detector包,这肯定是在告诉我我有一个 n+1 问题。

最佳答案

似乎没有办法在 Laravel 的递归中急切加载嵌套关系,或者至少在这种情况下没有(尝试在多个地方询问,而不仅仅是 stackoverflow)。

因此,为了解决我的问题,我将以正常方式加载所有父评论及其关系,但只加载子评论作为数据,然后使用 AJAX 调用填充它们。这只会添加一个服务器查询。

关于php - Laravel - 在 Blade 中加载更多结果时如何避免 N+1 问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57774470/

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