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

LaravelEloquentvs.EagerLoading

时间:2023-03-30 02:24:15 PHP

Laravel中的Eloquent(ORM)效果惊人,并提供了一种非常简单的方法来访问数据库。在本文中,我们将了解LaravelEloquent中的延迟加载和急切加载,以及它们在幕后的工作原理。Eloquent中的关系第一步我们需要定义模型之间的关系。在这个例子中,我将使用两个模型,house和city。一座房子属于一座城市,一座城市有很多房子。我们看一下模型House的关系:classHouseextendsModel{protected$fillable=['title','description','price'];publicfunctioncity(){return$this->belongsTo('App\City');}}注意:对于多对一的关系(一个房子属于一个城市),函数名是单数的。[publicfunctioncity()]classCityextendsModel{protected$fillable=['name','code'];publicfunctionhouses(){return$this->hasMany('App\House');}}}注意:对于一对多关系(城市有很多房子),函数名是复数。[publicfunctionhouses()]延迟加载$houses=House::all();默认情况下,在Eloquent中访问数据是“延迟加载”。在上面的代码中,我们获取了内表中的所有数据,实际执行的SQL查询是:select*from`houses`这一步,关系表(city)中的数据还没有取到,如果我们想访问关系表中的数据,我们可以这样访问:foreach($housesas$house){echo$house->city->name;//这是延迟加载}实际执行的SQL查询是select*from`cities`where`cities`.`id`=?限制1select*from`cities`where`cities`.`id`=?限制1select*from`cities`where`cities`.`id`=?limit1...这个程序会循环遍历房屋内的所有记录,每次循环执行1次查询获取城市数据,例如我们有20条房屋记录,获取关系表中数据的查询将执行20times+1原始查询获取房屋数据,查询“懒加载”的时间为N+1。即时加载有时在你的应用程序中使用即时加载是有用的,例如,你正在使用Ajax调用数据,在这种情况下我们必须使用预先加载来准备所有数据与关系表中的数据,然后再返回结果给Ajax。要使用预先加载,只需在获取数据时使用with方法即可。$houses=House::with('city')->get();现在所有的房子数据和关系表中的数据同时加载,查询SQL语句为select*fromhousesselect*fromcitieswhereidin(1,2,3,4,5,...)使用预加载时只执行2个查询。如您所见,上面的查询中,一个查询是获取houses表中的所有数据,另一个查询是使用IN操作将id与houses表中的city_id进行匹配,以获取cities表中的所有数据。Lazyloading和eagerloading在某些情况下,这对于on-the-fly动态加载非常有用,我们可以决定是否需要加载关系表中的数据。$houses=House::all();if($isLoad){$houses->load('city');//对应房子模型中的city方法}我们可以使用load方法在一定条件下加载关系表的数据。这个很有用,大家可以在实践中多尝试。总结现在您了解了这个过程,希望它能帮助您理解延迟加载和预加载的用法和基本原理。更多PHP知识,可以去PHPCasts