• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Laravel Eloquent的 懒加载VS即时加载

武飞扬头像
折叠椅
帮助3

Laravel中的Eloquent(ORM)的工作方式很令人惊讶,并提供访问数据库的非常简单的方法。在本文中,我们将了解Laravel Eloquent中的懒加载和即时加载以及它如何在后台运行。

Eloquent 中的关系

第一步我们需要定义模型之间的关系的。在这个例子中,我将使用两个模型,housecity。房子属于一个城市,城市有很多房屋。让我们看看模型 House 的关系:

class House extends Model
{
    protected $fillable = [
        'title', 'description', 'price'
    ];

    public function city() {
        return $this->belongsTo('App\City');
    }
}
注意:对于多对一的关系(房子属于一个城市),函数名称是单数。 [public function city()]
class City extends Model
{
    protected $fillable = [
        'name', 'code'
    ];

    public function houses() {
        return $this->hasMany('App\House');
    }
}
注意:对于一对多关系(城市有很多房屋),函数名称是复数。 [public function houses()]

懒加载

$houses = House::all();

默认情况下,在Eloquent中访问数据是“懒加载”,在上面的代码中,我们获取了所有数据在内部表中,实际执行的SQL查询是:

select * from `houses`

在这一步中,关系表(城市)中的数据还没有被获取,如果我们想访问关系表中的数据,我们可以像这样访问:

foreach ($houses as $house) {
    echo $house->city->name; // 这就是懒加载
}

实际执行的SQL查询是

select * from `cities` where `cities`.`id` = ? limit 1
select * from `cities` where `cities`.`id` = ? limit 1
select * from `cities` where `cities`.`id` = ? limit 1
...

该过程将循环房屋内的所有记录,并为每个循环执行1次查询以获取城市数据,例如我们有20个房屋记录,查询获取关系表中的数据将执行20次 1原始查询获取 房屋数据,查询“延迟加载”的时间是N 1。

即时加载

有时在应用程序中使用即时加载非常有用,例如,你正在使用Ajax调用数据,在这种情况下,我们必须使用预加载来准备在关系表中包含数据的所有数据,然后再将结果返回给Ajax。 要使用即时加载,只需在获取数据时使用 with 方法。

$houses = House::with('city')->get();

现在所有的房屋数据和在关系表中的数据都同时加载出来了,查询的SQL语句的是

select * from houses
select * from cities where id in (1, 2, 3, 4, 5, ...)

使用即时加载时仅执行2个查询。 正如你可以看到上面的查询,一个查询是在房屋表中获取所有数据,另一个查询是获取城市表中的所有数据,使用IN操作将ID与房屋表中的city_id匹配。

懒加载 和 即时加载

在某些情况下,这对于即时动态加载非常有用,我们可以决定是否需要加载关系表中的数据。

$houses = House::all();

if($isLoad) {
    $houses->load('city'); // 对应 house model中的 city 方法
}

我们可以使用 load 方法在特定条件下加载关系表中的数据。

这一点非常有用,实际中大家可以多试试。

总结

现在你理解了这个过程,希望它能帮助你理解懒加载和即时加载的用法和基本原理。

更多PHP知识,可以前往PHPCasts

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanheagfgk
系列文章
更多 icon
同类精品
更多 icon
继续加载