为什么80%的码农都做不了架构师?>>>   

我们已经了解了怎样通过AR从单个数据表中获取数据,那么如果要关联多个数据表,AR又应该怎样操作列
我们看到,在 创建的AR模型User类里面有一个relations方法,它就是用来返回与当前表关联关系的
一、声明关系
要想在AR中使用关联查询,我们需要先申明user表与其他表的关联关系
AR中有四中关联关系,
BELONGS_TO(属于):比如,一个用户(user)只有一个城市id(city_id),但是一个城市id下面有多个用户,那么用户表就属于城市表,简单的表述就是 A表的多行数据对应B表的一行数据
HAS_MANY(有多个):比如,一个城市对应多个用户,那么城市表就有多个用户表
HAS_ONE(有一个):比如,一个用户只有一个用户简介,那么用户表就有一个用户简介表
MANY_MANY(多对多):比如,一个商家有多个分店,一个商品支持多个分店使用,那么需要一个中间表把商家的分店和商品关联起来,比如商品表Groupon,分店表shop,那么groupon_shop表用来存放商品和分店的关联关系

他们分别代表这几个类

const BELONGS_TO='CBelongsToRelation';const HAS_ONE='CHasOneRelation';const HAS_MANY='CHasManyRelation';const MANY_MANY='CManyManyRelation';const STAT='CStatRelation';
那么具体怎么去申明列
我们拿user表和city表来做个实例,根据刚才的判断,我们使用Belongs to来定义
先用gii生成一个City模型
public function relations(){// NOTE: you may need to adjust the relation name and the related// class name for the relations automatically generated below.return array('city'=>array(self::BELONGS_TO,'City','city_id'),);}
索引下表city是这个关联关系的名字,是自定义的,在后面调用$user->city可以获取到city表对应的数据
数组的第一个参数是 关系申明
第二个参数是关联的 AR模型
第三个参数是关联的外键名,
如果还需要设置其他的参数,可以在第四个参数用一个数组来设置,具体的可设置的参数参考 关联关系对应的四个类
二、单条语句使用关联查询
1.AR的关联查询支持 延迟加载和饥渴似加载两种
我们先来看延迟加载
在新建一个方法actionRelation
先找出user对象
public function actionRelation($id){$id = trim($id);//懒惰加载$user = User::model()->findByPk($id);//此时的user对象的related属性是一个空数组,user对象的打印结果如下图dump($user);
//        $city = $user->city;
//        dump($city);}

再调用user对象里面的city关联属性

public function actionRelation($id){$id = trim($id);//懒惰加载$user = User : : model() - > findByPk($id);//此时的user对象的related属性是一个空数组,user对象的打印结果如下图
//        dump($user);//获取与user对象相关联的city对象,调用city属性的时候,会调用relations方法里面city对应的 关联关系 找到city对象$city = $user - > city;//打印结果见下图dump($city);

当调用一次city属性之后,延迟加载了city对象 user对象的related属性添加了city对象值
public function actionRelation($id){$id = trim($id);//懒惰加载$user = User::model()->findByPk($id);//此时的user对象的related属性是一个空数组,user对象的打印结果如下图
//        dump($user);//获取与user对象相关联的city对象,调用city属性的时候,会调用relations方法里面city对应的 关联关系 找到city对象$city = $user->city;
//        dump($city);//此时我们再打印user对象,related属性就不是一个空数组了,打印结果如下图dump($user,false);//我们可以像调用user属性一样去调用city对象的属性,比如我想获取城市名dump($city->name);}

从数据库的角度来说,延迟加载就相当于先查询user表,然后根据city_id查询city表对应的数据
我们再来看看饥渴式加载

//饥渴式加载我们使用到关键词with在find之前

public function actionEager($id){$id = trim($id);//饥渴式加载$user = User::model()->with('city')->findByPk($id);dump($user);}

我们看到打印结果,如果使用with关键词之后,默认就已经将city表对应数据加载到user对象的related属性中

//饥渴式加载我们使用到关键词with在find之前public function actionEager($id){$id = trim($id);//饥渴式加载$user = User::model()->with('city')->findByPk($id);
//        dump($user);//获取城市名称$name = $user->city->name;//打印结果如下dump($name);}

'广州'

我们看到 当调用$user->city的时候 获取的就是对应的city对象
从数据库的角度来说 饥渴式加载 就相当于join查询user和city两张表 默认的join类型是left join左联查询
我们知道一张表可能会与多个表发生关联关系,比如 又来一张 user_info 表(用户信息表),user_info表里面有一个外键user_id关联表的id,而且user与user_info是一一对应的关系,那么在使用AR关联时,只需要在relations方法里面添加一个user_info
user_info表 建表语句
CREATE TABLE `user_info` (`id` int(10) unsigned NOT NULL auto_increment,`user_id` int(10) unsigned NOT NULL default '0' COMMENT '用户ID',`info` text character set utf8 NOT NULL COMMENT '简介',PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户信息表
//添加一个user_info 的关联关系public function relations(){// NOTE: you may need to adjust the relation name and the related// class name for the relations automatically generated below.return array('city'=>array(self::BELONGS_TO,'City','city_id'),'user_info'=>array(self::HAS_ONE,'UserInfo','user_id'),);}

在饥渴式加载中如下使用,with方法中添加一个参数user_info即可

public function actionEager($id){$id = trim($id);//饥渴式加载$user = User::model()->with('city','user_info')->findByPk($id);dump($user);}

打印结果如下图,可以看到city对象与user_info对象都已经加载到user对象的related属性中了

转载于:https://my.oschina.net/lonxom/blog/168257

十八、AR数据库的关联查询relations之单条数据查询相关推荐

  1. MySQL二十八规范数据库设计

    MySQL二十八:规范数据库设计 糟糕的数据库设计: ●数据冗余,浪费空间 ●数据库插入和删除都会麻烦.异常[ 屏蔽使用物理外键] ●程序的性能差 良好的数据库设计: ●节省内存空间 ●保证数据库的完 ...

  2. Reflex WMS入门系列十八:如何看年终盘点的Inventory report数据?

    Reflex WMS入门系列十八:如何看年终盘点的Inventory report数据? Reflex WMS系统中的盘点分为cycle count(循环盘点)和physical inventory( ...

  3. Django笔记二十八之数据库查询优化汇总

    这一篇笔记将从以下几个方面来介绍 Django 在查询过程中的一些优化操作,有一些是介绍如何获取 Django 查询转化的 sql 语句,有一些是理解 QuerySet 是如何获取数据的. 以下是本篇 ...

  4. 微信小程序开发之十八 —— 云数据库入门

    文章目录 学习前后 云数据库的基础知识 数据库权限限制 简易权限配置 安全规则 数据库查询 查询指令command 条件查询法一:Collection.where 条件查询法二:Collection. ...

  5. MySQL燕十八老师课程笔记:第十一课:子查询

    # 查出本网站最新的(goods_id)最大的一条商品 # 思路:按goods_id desc排序,再取第一行 select goods_id,goods_name from goods order ...

  6. Oracle数据库-第一章:select语句,数据查询操作

    前言: 1.一个认知 认知什么是oracle? oracle:商业运用第一的关系型数据库 实质:关系型数据库 了解oracle数据库发展历史(文档) 2.二个概念 数据库:数据存储的仓库 关系型数据库 ...

  7. (Java数据库编程基础操作)Statement实现数据查询操作

    Statement实现数据查询操作 在整个数据库的开发过程之中数据的查询操作是最复杂的,因为查询会牵扯到各种复杂查询的管理,例如:多表查询.子查询.统计查询.集合操作等等,但是从现代的开发来讲,对于数 ...

  8. 阿里云图数据库GDB公测,高度连接数据查询效率提升10倍

    3月21日,阿里云图数据库GDB正式公测,用于处理高度连接数据查询与存储,支持属性图模型,并且全面兼容TinkerPop Gremlin 查询语言. 图数据库覆盖的应用场景非常广泛,比较典型的有社交网 ...

  9. SQL查询效率:100w数据查询只需要1秒钟

    机器情况 p4: 2.4 内存: 1 G os: windows 2003 数据库: ms sql server 2000 目的: 查询性能测试,比较两种查询的性能 SQL查询效率 step by s ...

最新文章

  1. boundingRectWithSize 的使用
  2. Wireshark:Usage in Ubuntu 18.04 distribution
  3. SOA流程项目到底是业务流还是工作流
  4. Maven配置阿里镜像仓库
  5. html绘图环境,HTML_HTML5 在canvas中绘制文本附效果图,一、绘制文本 在绘图环境中提 - phpStudy...
  6. jenkins部署_Jenkins:部署JEE工件
  7. 2021-5-18大搜车
  8. 【转载】不带www跳转www.设定网站唯一入口,提升权重!
  9. leetcode 回文数
  10. Windows Azure系列公开课 - 第二课:为什么选择Windows Azure(下)
  11. 二维码编解码 Java调用示例代码
  12. Struts2的Action访问Session对象的两种方式及原理
  13. 设计教务管理系统MySQL,数据库设计实例 教务管理系统
  14. Intro.js 分步向导插件使用方法
  15. Ubuntu18.04 Deb 包安装方法
  16. QQ空间人气精灵王 QQ空间人气提升
  17. OpenStack必备基础知识
  18. 使用python脚本和crontab在阿里云实现优矿自动签到
  19. 各软件版本、仓库、官网地址
  20. JSP九大内置对象:

热门文章

  1. 在Vim中将DOS行尾转换为Linux行尾
  2. 如何在Bash脚本中将Heredoc写入文件?
  3. 大O,您如何计算/近似?
  4. spring Bean的初始化和销毁 (使用注解)
  5. RandomAccessFile 随机存取文件任意位置数据
  6. 中外合作有开计算机课吗,探究中外合作办学计算机应用课程建设.doc
  7. java vo转map_Java后端必备的开发规范
  8. python变量图片_在Python中向3D图添加第4个变量
  9. pcm5102a解码芯片音质评测_简单测评200元档可能是唯一搭载高通QCC3020芯片的真无线蓝牙耳机...
  10. ❤️再也不用为了重写方法而苦恼了,Lombok帮你解决!