1,首先多表关联是在models/xx.php的relations里配置的。而且是互配,但有区别。

格式:

'VarName'=>array('RelationType', 'ClassName', 'ForeignKey', ...additional options)

需要弄清楚的几点:

1,VarName指什么? 详见下面例2。

2,RelationType。一共有4种,分别为self::HAS_MANY, self::BELONGS_TO, self::MANY_MANY, self::HAS_ONE。

3,ClassName。即关联的另一个../model/类名.php。

4,ForeignKey。谁是谁的外键?写了是用主键关联,为空两个表不是用主键关联需要on

5,附加条件

两个表不是用主键关联

'user' => array(self::BELONGS_TO, 'OaskUser', '' ,'on'=>'name=userName' , 'select'=>'TrueName'),
'varchar'=>array(self::HAS_ONE, 'CustomerEntityVarchar', 'entity_id','select'=>'varchar.value','on'=>'varchar.attribute_id="831"'),  

BELONGS_TO(属于): 如果表 A 和 B 之间的关系是一对多,则 表 B 属于 表 A ;

HAS_MANY(有多个): 如果表 A 和 B 之间的关系是一对多,则 A 有多个 B ;

HAS_ONE(有一个): 这是 HAS_MANY 的一个特例,A 最多有一个 B ;

MANY_MANY: 这个对应于数据库中的多对多关系。 由于多数 DBMS 不直接支持 多对多 关系,因此需要有一个关联表将多对多关系分割为一对多关系。在 AR术语中,我们可以解释 MANY_MANY 为 BELONGS_TO 和 HAS_MANY 的组合。

STAT:除了上述的关系类型,一个特殊的关系,称为STAT也支持可用于进行统计查询(或聚合查询)。 检索聚合对相关对象的信息,如数量。如 一篇日志共有多少个评论

'detailCounts' => array(self::STAT, 'PurchaseDetail', 'purchase_hid'), 

例1,一对多关系(post和user之间的关系)

(1)models/Post.php

  1. classPostextendsCActiveRecord
    {
    ......
    publicfunction relations()
    {
    return array(
    'author'=>array(self::BELONGS_TO,'User','author_id'),
    'categories'=>array(self::MANY_MANY,'Category','tbl_post_category(post_id, category_id)'),
    );
    }
    }

其中Post与User的关系是BELONGS_TO(多对一)关系,并通过Post的author_id与User关联。Post中author_id是外键,关联到User中。注:此处的VarName是author,一个对象。

(2)models/User.php

class User extends CActiveRecord{  ......  public function relations(){  return array(  'posts'=>array(self::HAS_MANY, 'Post', 'author_id'),  );  }
}  

对于User,与Post的关系是属于HAS_MANY(一对多)关系。并通过Post的author_id与Post关联。 由于两者是一对多关系,所以要用posts

例2,多对多关系。中间表名(本表外键,many表外键)

在FailParts.php中

'Users' => array(self::MANY_MANY, 'User', 'fail_parts_user(fail_parts_id, user_id)'),

在User.php中

'FailParts' => array(self::MANY_MANY, 'FailParts', 'fail_parts_user(user_id, fail_parts_id)'), 

由于两者是多对多关系,所以要用Users,而不是User;要用FailParts,而不是FailPart。此处的Users和FailParts,即为前面的VarName。

例3,一对一关系。比较简单,暂略。

2,关于VarName。

对于类A.php,'VarName'=>array('RelationType', 'B', 'ForeignKey', ...additional options)

其中VarName与B基本相同。但未必完全一样。此时就可以在A的views/A/xx.php中通过VarName来访问B及其属性值了。

如果是一对一:A->VarName

如果是一对多:A->VarName->name

如果是多对多:

$users = As->VarName
foreach($users as $u){  $_tmp_users[] = $u -> getName;
}
userStr = implode(', ', $_tmp_users); 

懒惰式加载(lazy loading,也可译为 迟加载) 方式

// 获取 ID 为 10 的帖子
$post=Post::model()->findByPk(10);
// 获取帖子的作者(author): 此处将执行一个关联查询。
$author=$post->author;

懒惰式加载用起来很方便,但在某些情况下并不高效。

渴求式加载(eager loading)方式。

$posts=Post::model()->with('author','categories')->findAll();
AR scopes//SchoolDepartment::model()->allDepartmentAndClass($id)->findAll();
public function relations()
{  return array(  'class' => array(self::HAS_MANY, 'SchoolClass', 'school_department_id'),  );
}  public function scopes() {  return array(  'allDepartmentAndClass',  );
}  public function allDepartmentAndClass($id) {  $this->getDbCriteria()->mergeWith(array(  'with' => "class",  'condition' => "t.tbl_school_id=$id",  ));  return $this;
} 

yii的relations里self::BELONGS_TO默认是用当前指定的键跟关联表的主键进行join,例如:

Post

return array('reply' => array(self::BELONGS_TO, 'BookPostReply', 'postid'),
);

默认生成的sql类似 on id = postid,id是本表的主键,postid是表BookPostReply的一个字段(主键)

但是需要生成 on BookPostReply.postid = t.postid

关联非主键字段

方法一,改成如下:

return array('reply' => array(self::BELONGS_TO, 'BookPostReply', '', 'on' => 'postid=postid'),
);

方法二:

array(self::BELONGS_TO,'对应的模型',array('本模型的外键'=>'对应模型的主键'))

这样也可以定义的,只要明确指定主键和对应表的外键就可以了。

官方开发指南里是这样写的:

array('fkc1'=>'pkc1','fkc2'=>'pkc2')

描述:yii的relations 关联非主键字段

来源: <http://www.imhdr.com/1454/>
来自为知笔记(Wiz)

转载于:https://www.cnblogs.com/lookphp/p/5123588.html

Yii 多表关联relations,需要与with()方法联合使用相关推荐

  1. 关于表关联数据几种展示方法

    我们一般在数据库用主外建关联多张表,下面就是给大家演示当两张表关联的时候的几种展现方式: 查询到表关联数据大致可以分为两类 一.封装一个实体类 封装一个实体类就是把两张表的数据都封装到一个实体类里,然 ...

  2. jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询

    上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...

  3. 后盾网lavarel视频项目---lavarel多表关联一对多操作实例

    后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...

  4. MapReduce编程(五) 单表关联

    一.问题描述 下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格. 输入文件内容如下: child parent Steven Lucy Steven Jack ...

  5. 大主子表关联的性能优化方法

    [摘要] 主子表是数据库最常见的关联关系之一,最典型的包括合同和合同条款.订单和订单明细.保险保单和保单明细.银行账户和账户流水.电商用户和订单.电信账户和计费清单或流量详单.当主子表的数据量较大时, ...

  6. sql语句语法多表关联_SQL Delete语句-如何删除行或表,语法示例

    sql语句语法多表关联 To delete a record in a table you use the  DELETE  statement. 要删除表中的记录,请使用DELETE语句. Be c ...

  7. MySQL百万级、千万级数据多表关联SQL语句调优

    本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 希望读者能够理解 ...

  8. mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优

    作者:成金之路 www.cnblogs.com/uttu/p/6384541.html 本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万 ...

  9. Oracle\MS SQL Server的数据库多表关联更新UPDATE与多表更新

    一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表 一.MS    S ...

  10. 使用外部表关联MySQL数据到Oracle

    因为业务需要,有个临时的活动需要DBA来支持一些数据业务,问题来了,需要从MySQL端同步一部分数据到Oracle端,然后从Oracle端匹配查到相应的数据返回给MySQL,至于原因,也是不同的业务系 ...

最新文章

  1. 探索 COVID-19 新冠数据来学习 Pandas
  2. 关于虚函数(多态)与继承的一道搜狗笔试题
  3. STM32 基础系列教程 31 – DAC
  4. 爱玛士关于爬虫的scrapy框架的心得
  5. mysql 字符串中取整_MySQL取整
  6. python 元类 type_python Class:面向对象高级编程 元类:type
  7. 高校云计算机中心建设方案,最新某大学云数据中心建设方案.pdf
  8. Entity Framework教程(第二版)
  9. TCP三次握手四次挥手介绍
  10. linux将passwd文件拷贝到,Linux命令
  11. Struts2.0 + Spring2.5 + Hibernate3.3开发环境的配置(1)
  12. matlab的基本语法规则_Matlab基本语法与指令
  13. 收款码三合一生成系统源码
  14. Unity3D脚本中文系列教程(八)
  15. 在线运行python的网站-Python在线练习运行平台
  16. 如何快速找出一个数组中最大数和第二大数
  17. MTK 开发流程和开发环境
  18. 一个精英的诞生,家庭因素有多大?
  19. 什么是全景图?如何进行vr全景图拍摄
  20. cefsharp实现双屏显示网页(横屏|竖屏)可拖动分隔条

热门文章

  1. 【BZOJ1923】[Sdoi2010]外星千足虫 高斯消元
  2. python自动化--接口请求及封装
  3. linux service
  4. MyEclipse 2016 安装/破解
  5. Javascript 学习之路:鼠标长按事件
  6. Perl获取前后任意月份月末
  7. linux 下idea 启动tomcat报JMX 1099错误解决办法
  8. sql生成(查询数据的存储过程)代码的存储过程
  9. React 16.7.0-alpha hooks 之规则
  10. 最最最最最最最最基础的C---函数