ORM模型里的渴求式加载与懒惰式加载


懒惰式加载

    // 获取 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 实例填充了。 渴求式加载通过 一个 关联查询返回所有帖子及其作者,而不是对每个帖子执行一次关联查询。

渴求式加载的顺序大概是,在查询帖子模型实例之后就把作者模型实例给查询出来了,总共就查询了两次,后续的关联查询就不会在数据库里查询,因此在关联数据较大的情况下使用渴求式加载节约性能


文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
JWT流程详解 JWT流程详解
JWT的流程详解JWT流程总览 用户端发送登录请求携带账号以及密码 或者其他登录方式都可以 服务端验证并通过请求后开始生成token,并返回到客户端 客户端接收到token后需要存在本地,以做后续请求的验证 此后的每一次客户端发
下一篇 
docker的Kubernetes学习笔记 docker的Kubernetes学习笔记
kubernetes(简称:k8s)k8s是一个集群编排工具(集群调度程序) 使用所需要注意的地方 使用k8s需要连接外网,所以可以使用vpn或者使用大厂的解决工具k8s-for-docker-desktop(github仓库里搜索) 验证
2019-11-01
  目录