Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel:改进的pivot查询_Laravel_Laravel 4 - Fatal编程技术网

Laravel:改进的pivot查询

Laravel:改进的pivot查询,laravel,laravel-4,Laravel,Laravel 4,我成功地查询了以下内容,它创建了130个查询,我想优化它并减少查询的数量,我已经设置了以下方式的模型和控制器 后模态 类别模态 在控制器中,我使用下面的查询,下面的查询所做的是根据类别id查询结果 $category = Category::with('posts')->where('id','=',$id)->paginate(10)->first(); return Response::json(array('category' => $category)); 如果

我成功地查询了以下内容,它创建了130个查询,我想优化它并减少查询的数量,我已经设置了以下方式的模型和控制器

后模态

类别模态

在控制器中,我使用下面的查询,下面的查询所做的是根据类别id查询结果

$category = Category::with('posts')->where('id','=',$id)->paginate(10)->first();
return Response::json(array('category' => $category));

如果有人能帮我优化查询,那就太好了。

你错了,它不会创建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');
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;
但问题是你到底想写什么。现在对类别进行分页,这没有多大意义,因为只有一个类别具有选定的$id

您可能希望得到的是:

$category = Category::where('id','=',$id)->first();
$posts = $category->posts()->paginate(10);
这将再次创建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');
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;
如果您想改进它,您可能不需要在本例中使用Eloquent,而需要使用join,但它值得吗?您现在需要在不进行分页的情况下手动对结果进行分页,这样您可能就不希望这样做了

编辑

您可能会做的是:

你会得到所有属于该类别的帖子,但实际上你只想对其中的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 />";
    }
}
要显示它,您应该使用:

$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 />";
    }
}

它会将您的查询次数从130次降至4次

我收到以下消息![在此处输入图像描述][1][1]:@Yoosuf,其中只有3个连接到上面。您应该查看代码的其余部分您还需要做什么,因为其他查询可能由其他代码执行。您还可以显示更多代码编辑您的问题以显示这一点。您是否显示每个帖子的类别?正如我向您展示的,第一个问题是您使用的分页,您不需要10条记录,但所有记录可能都有100篇文章