with inquiries

Related inquiries

 DB::enableQueryLog();
        $filter = [];
        $filter['course_id'] = $course_id;
//        $filter['with']['user'] = [];
        CourseUser::items($filter);
        $query =DB::getQueryLog();
        return self::success($query);

Printed execute sql

 {
            "query": "select count(*) as aggregate from `wm_course_user` where (`wm_course_user`.`is_delete` = ?)",
            "bindings": [
                0
            ],
            "time": 0.28
        },
        {
            "query": "select `wm_course_user`.`id`, `wm_course_user`.`user_id`, `wm_course_user`.`course_id`, `wm_course_user`.`created_at` from `wm_course_user` where (`wm_course_user`.`is_delete` = ?) order by `wm_course_user`.`id` desc limit 20 offset 0",
            "bindings": [
                0
            ],
            "time": 0.28
        }

I do not find access to data associated with it, will not execute sql queries, this is lazy loaded. Now I'm going to use the data associated with it, look at the query

DB::enableQueryLog();
        $filter = [];
        $filter['course_id'] = $course_id;

//        $filter['with']['user'] = [];
        $items = CourseUser::items($filter);
        foreach($items as $value){
            var_dump($value->user->name);
        }
        $query =DB::getQueryLog();
        return self::success($query);

sql print execution is as follows

{
            "query": "select count(*) as aggregate from `wm_course_user` where (`wm_course_user`.`is_delete` = ?)",
            "bindings": [
                0
            ],
            "time": 0.25
        },
        {
            "query": "select `wm_course_user`.`id`, `wm_course_user`.`user_id`, `wm_course_user`.`course_id`, `wm_course_user`.`created_at` from `wm_course_user` where (`wm_course_user`.`is_delete` = ?) order by `wm_course_user`.`id` desc limit 20 offset 0",
            "bindings": [
                0
            ],
            "time": 0.27
        },
        {
            "query": "select * from `wm_user` where `wm_user`.`id` = ? limit 1",
            "bindings": [
                1643
            ],
            "time": 0.44
        },
        {
            "query": "select * from `wm_user` where `wm_user`.`id` = ? limit 1",
            "bindings": [
                2
            ],
            "time": 0.37
        }

Each association should see a database query, the query that is the problem of the so-called N + 1's.

DB::enableQueryLog();
        $filter = [];
        $filter['course_id'] = $course_id;

//        $filter['with']['user'] = [];
        $items = CourseUser::items($filter);
        foreach($items as $value){
            if($value->user_id == 2){
                var_dump($value->user->name);
            }
        }
        $query =DB::getQueryLog();
        return self::success($query);

Execute the statement

{
            "query": "select count(*) as aggregate from `wm_course_user` where (`wm_course_user`.`is_delete` = ?)",
            "bindings": [
                0
            ],
            "time": 0.28
        },
        {
            "query": "select `wm_course_user`.`id`, `wm_course_user`.`user_id`, `wm_course_user`.`course_id`, `wm_course_user`.`created_at` from `wm_course_user` where (`wm_course_user`.`is_delete` = ?) order by `wm_course_user`.`id` desc limit 20 offset 0",
            "bindings": [
                0
            ],
            "time": 0.25
        },
        {
            "query": "select * from `wm_user` where `wm_user`.`id` = ? limit 1",
            "bindings": [
                2
            ],
            "time": 0.47
        }

How to avoid N + 1 problem? Use pre-loaded with queries

DB::enableQueryLog();
$filter = [];
$filter['course_id'] = $course_id;
$filter['with']['user'] = [];
CourseUser::items($filter);
$query =DB::getQueryLog();
return self::success($query);

Sql execute print out as follows

 {
            "query": "select count(*) as aggregate from `wm_course_user` where (`wm_course_user`.`is_delete` = ?)",
            "bindings": [
                0
            ],
            "time": 0.28
        },
        {
            "query": "select `wm_course_user`.`id`, `wm_course_user`.`user_id`, `wm_course_user`.`course_id`, `wm_course_user`.`created_at` from `wm_course_user` where (`wm_course_user`.`is_delete` = ?) order by `wm_course_user`.`id` desc limit 20 offset 0", "bindings": [ 0 ], "time": 0.31 }, { "query": "select * from `wm_user` where `wm_user`.`id` in (2, 1643)", "bindings": [], "time": 0.43 }

A total of three times the query.

When accessing Eloquent way associated with property associated data "lazy loading." This is the first visit to the property until the associated data will only be real load. But Eloquent can "pre-loaded" in the sub-query related parent model. Preloading can ease the N + 1 query problem.

When using lazy loading, when to use pre-loaded it? Content list data to be presented using the pre-loaded content in details which only need to demonstrate the use of lazy loading.

Guess you like

Origin www.cnblogs.com/webclz/p/10932113.html