当前位置: 首页 > 后端技术 > PHP

使用预加载优化Laravel模型查询

时间:2023-03-29 17:39:54 PHP

原文翻译自eloquent-eager-loading,简化了前面部分构造数据。引入对象关系映射(ORM)使使用数据库变得非常容易。当数据库关系以面向对象的方式定义时,相关的模型数据可以很容易地被查询到,而开发者可能不会关注底层的数据库调用。下面是一些示例,可进一步帮助您了解如何优化查询。假设您从数据库中收到了100个对象,每个记录都有1个关联模型(即belongsTo)。默认情况下,使用ORM会生成101个查询;如下://获取100篇发表的文章$posts=Post::limit(100)->get();//一个查询$authors=array_map(function($post){//为作者模型生成一个查询return$post->author->name;},$posts);我们在查询时没有告诉Post模型,我们还需要所有的作者,所以每次从单个Post模型实例中检索作者姓名时都会发生单独的查询。array_maps期间发生了100次查询,加上前面的查询,一共产生了101次查询。Eagerloading接下来,如果我们打算使用关联的模型数据,我们可以使用eagerloading将总共101个查询减少到2个查询。只需告诉模型您需要加载什么。如下://获取100篇已发表的文章——并预加载文章的相应作者$posts=Post::with('author')->limit(100)->get();//2查询$authors=array_map(function($post){//生成作者模型的查询return$post->author->name;//这里不是生成查询},$posts);如果启用sql日志,您会看到上面的Preloading只会生成两个查询:select*from`posts`select*from`authors`where`authors`.`id`in(?,?,?,?,?)[1,2,3,4,5]如果你有多个关联模型,你可以使用数组加载它们:$posts=App\Post::with(['author','comments'])->get();接下来我们重新定义如下RelationshipPost->belongsTo->Author//每篇文章只属于一个用户Author->hasMany->Post//每个用户有多篇文章Author->hasOne->Profile//每个用户只有一篇profileforconsideration上下文:获取已发表文章的作者的简介。//获取所有文章——并预加载文章的相应作者$posts=App\Post::with('author')->get();//两次查询//根据每个`author`获取其简介$posts->map(function($post){//虽然我们直接传$author=$post->author不会生成一个query,//但是$author->profile调用的时候,每次都会生成一个新的query时间返回$post->author->profile;});假设上面的App\Post::with('author')->get()有100条记录,会产生多少条查询?通过优化预加载,我们可以避免嵌套关系中的额外查询。//获取所有文章——并预加载文章的通讯作者和每个作者对应的deprofile$posts=App\Post::with('author.profile')->get();//三个查询$posts->map(function($post){//没有新查询return$post->author->profile;});你可以打开你的sql日志来查看对应的三个查询。select*from`posts`select*from`authors`where`authors`.`id`in(?,?,?,?,?)[...]select*from`profiles`where`profiles`。`author_id`in(?,?,?,?,?)[...]延迟加载有时您可能只需要根据条件收集相关模型。在这种情况下,你可以懒惰地调用其他查询来获取相关数据:$posts=App\Post::all();//onequery$posts->load('author.profile');//twiceQuery$posts->map(function($post){//没有新的查询return$post->author->profile;});检查你的sql日志,总共看到三个查询,但只会显示call$posts->load()。结论希望您了解更多有关加载模型的知识,并更深入地了解它的工作原理。Laravel的文档非常全面,希望额外的实践练习能帮助您对优化关系查询更有信心。