Home Backend Development PHP Tutorial Detailed explanation of how Laravel optimizes Model queries through preloading

Detailed explanation of how Laravel optimizes Model queries through preloading

Jan 03, 2018 pm 03:22 PM
laravel load pass

This article mainly introduces you to the relevant information on how to use preloading to optimize Laravel Model queries. The article introduces it in detail through sample code. It has certain reference learning value for everyone's study or work. Friends who need it can follow below. Let’s learn together. I hope to be helpful.

Preface

This article mainly introduces the relevant content about using preloading to optimize Laravel Model query, and shares it for your reference and study. Not much to say, let’s take a look at the detailed introduction:

Introduction

Object-relational mapping (ORM) makes the database work becomes very simple. When database relationships are defined in an object-oriented manner, related model data can be easily queried, and developers may not notice the underlying database calls.

The following will use some examples to further help you understand how to optimize queries.

Suppose you receive 100 objects from the database and each record has 1 associated model (i.e. belongsTo). Using the ORM by default will generate 101 queries; as shown below:

//获取已发布的100条文章
$posts = Post::limit(100)->get(); //一次查询

$authors = array_map(function($post) {
 // 对作者模型生成查询
 return $post->author->name;
}, $posts);
Copy after login

We don't tell the Post model at query time that we also need all the authors, so every time we get the author's name from a single Post model instance, A separate query will occur.

array_maps 100 queries occurred, plus the previous query, a total of 101 queries were generated.

Preloading

Next, if we plan to use associated model data, we can use preloading to The total number of 101 queries is reduced to 2 queries. Just tell the model what you need to load. As follows:

//获取已发布的100条文章 - 并预加载文章对应作者
$posts = Post::with('author')->limit(100)->get();//2次查询

$authors = array_map(function($post) {
 // 对作者模型生成查询
 return $post->author->name;//这里讲不在产生查询
}, $posts);
Copy after login

If you enable sql logs, you will see that the above preloading will only generate two queries:

select * from `posts`
select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [1,2,3,4,5]
Copy after login

If you have multiple related models, you can use arrays Load them:

$posts = App\Post::with(['author', 'comments'])->get();
Copy after login

Next we redefine the following relationship

Post -> belongsTo -> Author //每个文章只属于一个用户
Author -> hasMany -> Post //每个用户拥有多个文章
Author -> hasOne -> Profile //每个用户只有一个简介
Copy after login

Consider the following situation: Get the profile of the author of the published article.

//获取所有文章 - 并预加载文章对应作者
$posts = App\Post::with('author')->get();//两次查询

//根据每个 `作者` 获取其简介
$posts->map(function ($post) {
 //虽然我们直接通过$author = $post->author不会产生查询,
 //但当调用$author->profile时,每次都会产生一个新查询
 return $post->author->profile;
});
Copy after login

Assume that the above App\Post::with('author')->get() has 100 records, how many queries will be generated?

By optimizing preloading, we can avoid extra queries in nested relationships.

//获取所有文章 - 并预加载文章对应作者及每个作者对应de profile
$posts = App\Post::with('author.profile')->get();//三次查询

$posts->map(function ($post) {
 //不在产生新查询
 return $post->author->profile;
});
Copy after login

You can open your sql log to see the corresponding three queries.

select * from `posts` 
select * from `authors` where `authors`.`id` in (?, ?, ?, ?, ?) [.....] 
select * from `profiles` where `profiles`.`author_id` in (?, ?, ?, ?, ?) [.....]
Copy after login

Lazy loading

Sometimes you may just need to collect associated models based on conditions. In this case you can lazily call other queries for related data:

$posts = App\Post::all();//一次查询

$posts->load('author.profile');//两次查询
$posts->map(function ($post) {
 //不在产生新查询
 return $post->author->profile;
});
Copy after login

Looking at your sql logs, I see three queries in total, but only when $posts->load() is called will be displayed.

Conclusion

Hopefully you know more about loading models and understand how it works on a deeper level . The documentation related to Laravel is already very comprehensive. I hope the additional practical exercises can help you become more confident in optimizing relational queries.

Summary

The original text is translated from eloquent-eager-loading, simplifying the previous part of constructing data.

Related recommendations:

Sharing examples of Laravel using Alipay payment

Detailed explanation of Laravel's method of implementing supervisor to execute asynchronous processes

Detailed explanation of Laravel's task scheduling console

The above is the detailed content of Detailed explanation of how Laravel optimizes Model queries through preloading. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to get the return code when email sending fails in Laravel? How to get the return code when email sending fails in Laravel? Apr 01, 2025 pm 02:45 PM

Method for obtaining the return code when Laravel email sending fails. When using Laravel to develop applications, you often encounter situations where you need to send verification codes. And in reality...

Laravel schedule task is not executed: What should I do if the task is not running after schedule: run command? Laravel schedule task is not executed: What should I do if the task is not running after schedule: run command? Mar 31, 2025 pm 11:24 PM

Laravel schedule task run unresponsive troubleshooting When using Laravel's schedule task scheduling, many developers will encounter this problem: schedule:run...

In Laravel, how to deal with the situation where verification codes are failed to be sent by email? In Laravel, how to deal with the situation where verification codes are failed to be sent by email? Mar 31, 2025 pm 11:48 PM

The method of handling Laravel's email failure to send verification code is to use Laravel...

How to implement the custom table function of clicking to add data in dcat admin? How to implement the custom table function of clicking to add data in dcat admin? Apr 01, 2025 am 07:09 AM

How to implement the table function of custom click to add data in dcatadmin (laravel-admin) When using dcat...

Laravel Redis connection sharing: Why does the select method affect other connections? Laravel Redis connection sharing: Why does the select method affect other connections? Apr 01, 2025 am 07:45 AM

The impact of sharing of Redis connections in Laravel framework and select methods When using Laravel framework and Redis, developers may encounter a problem: through configuration...

Laravel Eloquent ORM in Bangla partial model search) Laravel Eloquent ORM in Bangla partial model search) Apr 08, 2025 pm 02:06 PM

LaravelEloquent Model Retrieval: Easily obtaining database data EloquentORM provides a concise and easy-to-understand way to operate the database. This article will introduce various Eloquent model search techniques in detail to help you obtain data from the database efficiently. 1. Get all records. Use the all() method to get all records in the database table: useApp\Models\Post;$posts=Post::all(); This will return a collection. You can access data using foreach loop or other collection methods: foreach($postsas$post){echo$post->

Laravel multi-tenant extension stancl/tenancy: How to customize the host address of a tenant database connection? Laravel multi-tenant extension stancl/tenancy: How to customize the host address of a tenant database connection? Apr 01, 2025 am 09:09 AM

Custom tenant database connection in Laravel multi-tenant extension package stancl/tenancy When building multi-tenant applications using Laravel multi-tenant extension package stancl/tenancy,...

Laravel's geospatial: Optimization of interactive maps and large amounts of data Laravel's geospatial: Optimization of interactive maps and large amounts of data Apr 08, 2025 pm 12:24 PM

Efficiently process 7 million records and create interactive maps with geospatial technology. This article explores how to efficiently process over 7 million records using Laravel and MySQL and convert them into interactive map visualizations. Initial challenge project requirements: Extract valuable insights using 7 million records in MySQL database. Many people first consider programming languages, but ignore the database itself: Can it meet the needs? Is data migration or structural adjustment required? Can MySQL withstand such a large data load? Preliminary analysis: Key filters and properties need to be identified. After analysis, it was found that only a few attributes were related to the solution. We verified the feasibility of the filter and set some restrictions to optimize the search. Map search based on city

See all articles