Вы ошибаетесь, это не создает 130 запросов.
Это создаст следующие 3 запросов:
select count(*) as aggregate from `categories` where `id` = '5';
select * from `categories` where `id` = '5' limit 10 offset 0;
select `posts`.*, `posts_categories`.`category_id` as `pivot_category_id`, `posts_categories`.`post_id` as `pivot_post_id` from `posts` inner join `posts_categories` on `posts`.`id` = `posts_categories`.`post_id` where `posts_categories`.`category_id` in ('5');
Но вопрос в том, что именно вы хотите постраничной. Теперь вы разбиваете категории на категории, и это не имеет большого смысла, потому что есть только одна категория с выбранными $id
.
То, что вы, вероятно, хотите, чтобы получить это:
$category = Category::where('id','=',$id)->first();
$posts = $category->posts()->paginate(10);
и это будет снова создать 3 запросы:
select * from `categories` where `id` = '5' limit 1;
select count(*) as aggregate from `posts` inner join `posts_categories` on `posts`.`id` = `posts_categories`.`post_id` where `posts_categories`.`category_id` = '5';
select `posts`.*, `posts_categories`.`category_id` as `pivot_category_id`, `posts_categories`.`post_id` as `pivot_post_id` from `posts` inner join `posts_categories` on `posts`.`id` = `posts_categories`.`post_id` where `posts_categories`.`category_id` = '5' limit 10 offset 0;
Если вы хотите улучшить его, вы, вероятно, нужно не использовать красноречивый в этом случае и использовать join
- но стоит ли? Теперь вам нужно будет вручную вывести на экран результаты без paginate()
, поэтому, вероятно, вы не захотите этого достичь.
EDIT
То, что вы, вероятно, сделать это:
- вы получите все сообщения, которые принадлежат к категории (но на самом деле вы хотите постраничной только 10 из них)
- для каждого вы хотите показать все категории, к которым он принадлежит.
Чтобы снизить число запросов, вы должны использовать:
$category = Category::where('id','=',$id)->first();
$posts = $category->posts()->with('categories')->paginate(10);
и отобразить его следует использовать:
foreach ($posts as $p) {
echo $p->name.' '."<br />";
foreach ($p->categories as $c) {
echo $c->name."<br />";
}
}
Это должно снизить число запросов к 4 из 130
Я получаю следующее сообщение! [Введите описание изображения здесь] [1] [1]: h ttp: //i.stack.imgur.com/T7CW4.png – Yoosuf
@Yoosuf И только 3 первых из них связаны с выше.Вы должны посмотреть на остальную часть своего кода, что еще вы делаете, потому что другие запросы, вероятно, выполняются каким-то другим кодом. Вы также можете показать больше кода (отредактируйте свой вопрос), чтобы показать это. Вы показываете категории для каждого из своих сообщений? Как я показал вам, первая проблема связана с разбивкой по страницам, вы не принимаете 10 записей, но все они (возможно, у вас есть 100 сообщений) –
@Yoosuf Я отредактировал свой ответ –