专栏名称: 狗厂
目录
相关文章推荐
51好读  ›  专栏  ›  狗厂

Laravel Eloquent中的 懒加载VS即时加载

狗厂  · 掘金  ·  · 2018-05-10 02:10

正文

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

Eloquent 中的关系

第一步我们需要定义模型之间的关系的。在这个例子中,我将使用两个模型, house city 。房子属于一个城市,城市有很多房屋。让我们看看模型 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。







请到「今天看啥」查看全文