Laravel - n+1 Проблема в рекурсии моих отношенийPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Laravel - n+1 Проблема в рекурсии моих отношений

Сообщение Anonymous »

У меня есть сайт Laravel, который я строю. У него есть представления, а в представлениях есть комментарии. Я хочу стремиться загрузить эти комментарии и его детские комментарии (и дети этих комментариев и т. Д.). Но только до точки. /> контроллер: < /strong> < /p>

Код: Выделить всё

$repliesCount = Comment::with([
'owner',
'savedComments',
'votes',
])
->where('submission_id', $submission->id)
->whereNotNull('parent_id')
->count();

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

$replies = Comment::where('submission_id', $submission->id)
->whereNotNull('parent_id')
->with([
'owner',
'savedComments',
'votes',
'submission',
'reports'
])
->orderBy('removed', 'asc')
->orderBy($sortBy, $direction)
->paginate($repliesCount);

$comments_by_id = new Collection();
$replies_by_id = new Collection();
foreach ($comments as $comment) {
$comments_by_id->put($comment->id, $comment);
$comments_by_id->get($comment->id)->children = new Collection();
}
foreach ($replies as $reply) {
$replies_by_id->put($reply->id, $reply);
$replies_by_id->get($reply->id)->children = new Collection();
}
foreach ($replies as $key => $reply) {
if ($comments_by_id->get($reply->parent_id)) {
$comments_by_id->get($reply->parent_id)->children->push($reply);
} elseif ($replies_by_id->get($reply->parent_id)) {
$replies_by_id->get($reply->parent_id)->children->push($reply);
}
}
blade: [/b]

Код: Выделить всё

@foreach ($comment->children as $comment)
@if ($loop->depth == 10)

[url={{ route(] $comment->submission->subchan, 'id' => $comment->submission->id, 'URLtitle' => $comment->submission->URL_title,'commentID' => $comment->parent_id]) }}">Continue this thread[/url]

@break
@endif
id}}" hidden-level="{{ceil(($loop->iteration + 3) / 10) - 1}}">
@include('partials.comment_block')

@if ($loop->iteration % 10 == 7 && $loop -> remaining > 0)

hidden-level="{{ceil(($loop->iteration + 3) / 10) - 1}}"
data-submission-id="{{ $comment->submission->id }}"
data-parent-id="{{$comment->parent_id}}"

>Load More Replies ({{ $loop->remaining }})
@endif
@endforeach
< /code>
В основном я беру 100 комментариев ($comments
), и я стремлюсь загрузить необходимые мне отношения (например, отношения «владельца»).
Затем я делаю запрос, чтобы все дети комментарии к этому представлению (

Код: Выделить всё

$replies
) и все его отношения.
После этого я создаю коллекцию, которая подтолкнет каждого ребенка ответить в свой родительский комментарий-> дети .
Это работает. Тем не менее, он загружает всех детей, отвечает на данный комментарий. Таким образом, хотя я загружаю только 100 комментариев родителей, если в одном из этих комментариев или дочерних комментариев есть тысячи детских комментариев, он загружает их всех за один раз. src = "https://i.sstatic.net/ogjlq.png"/>
Что я в конечном итоге хочу, чтобы это только стремительные нагрузки и возвращает максимум из 10 детей, а также проходя, сколько детей, так что я могу показать, сколько детей не хватает.

Подробнее здесь: https://stackoverflow.com/questions/626 ... -recursion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»