当前示例在我的代码中导致N + 1?

时间:2016-12-28 08:24:03

标签: laravel pagination laravel-eloquent

我正在尝试加载类别(子级)以在html表中查看它们并将它们分页为:

// show category children's 

public function show(subCategory $sections)
    {
        // Eager Loading the relationship
       $sections->with('chlidrens');

       // paginate the category - childrens

        $result = $sections->chlidrens()->orderBy('created_at','desc')->paginate(5);

        return view('CompanySections.show',compact('sections','result'));
    } 

我已经记录第一页的sql查询,如下所示:

[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `catnodestreetable` where `id` = ? limit 1"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `customers` where `customers`.`id` = ? limit 1"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select count(*) as aggregate from `catnodestreetable` where `catnodestreetable`.`node_parent_id` = ? and `catnodestreetable`.`node_parent_id` is not null"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `catnodestreetable` where `catnodestreetable`.`node_parent_id` = ? and `catnodestreetable`.`node_parent_id` is not null order by `created_at` desc limit 5 offset 0"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `categories` where `categories`.`id` = ? limit 1"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `clothes` where `clothes`.`item_id` = ? and `clothes`.`item_id` is not null limit 1"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `clothes` where `clothes`.`item_id` = ? and `clothes`.`item_id` is not null limit 1"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `clothes` where `clothes`.`item_id` = ? and `clothes`.`item_id` is not null limit 1"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `clothes` where `clothes`.`item_id` = ? and `clothes`.`item_id` is not null limit 1"} 
[2016-12-28 08:19:20] local.INFO: query {"query":"select * from `clothes` where `clothes`.`item_id` = ? and `clothes`.`item_id` is not null limit 1"} 

我的问题:此代码导致N + 1 !! 如果它确实......如何解决它?

1 个答案:

答案 0 :(得分:0)

你做的with电话没有进一步的效果。直接运行关系方法时不会考虑它。您可以使用eager loaded constraints

执行以下操作
public function show(subCategory $sections)
{
    $result = $sections->with(['children' => function($query) {
        $query->orderBy('created_at', 'desc');
    }])->paginate(5);

    return view('CompanySections.show',compact('sections','result'));
}