懒惰式加载
// 获取 ID 为 10 的帖子
$post=Post::model()->findByPk(10);
// 获取帖子的作者(author): 此处将执行一个关联查询。
$author=$post->author;
用模型的属性的方式加载关联属性数据,则为懒惰式加载,仅当第一次访问关联属性时,才进行查询加载。
加入一次性要访问的数据比较多,比如一个表格中,若干干行的数据都是此关联属性。那么懒惰式加载将非常影响效率。
因为每个关联属性,都会单独的去查询一次数据库。
懒惰式加载本质是N+1查询,假设查询25个帖子及其作者的时候,可能就会查询26次数据库,第一次是查询所有帖子,然后25次是查询每个帖子的作者
大致顺序是先请求数据库获取帖子模型实例,然后再去拿帖子的关联属性去查询作者模型实例,这样的话在关联的数据较大时候会浪费数据库的性能.
渴求式加载
$posts=Post::model()->with('author')->findAll();
上述代码将返回一个 Post 实例的数组。与懒惰式加载方式不同,在我们访问每个 Post 实例中的 author 属性之前,它就已经被关联的 User 实例填充了。 渴求式加载通过 一个 关联查询返回所有帖子及其作者,而不是对每个帖子执行一次关联查询。
渴求式加载的顺序大概是,在查询帖子模型实例之后就把作者模型实例给查询出来了,总共就查询了两次,后续的关联查询就不会在数据库里查询,因此在关联数据较大的情况下使用渴求式加载节约性能