Yii 多表关联relations,需要与with()方法联合使用
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
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 关联非主键字段
转载于:https://www.cnblogs.com/lookphp/p/5123588.html
Yii 多表关联relations,需要与with()方法联合使用相关推荐
- 关于表关联数据几种展示方法
我们一般在数据库用主外建关联多张表,下面就是给大家演示当两张表关联的时候的几种展现方式: 查询到表关联数据大致可以分为两类 一.封装一个实体类 封装一个实体类就是把两张表的数据都封装到一个实体类里,然 ...
- jpa多表关联查询_Spring Boot 整合mybatis如何自定义 mapper 实现多表关联查询
上一篇文章已经介绍了自定义 mapper 实现自定义的方法,其实实现了通过自定义的mapper就可以做多表关联等复杂查询.但是很多朋友还是反馈说没有实现多表关联查询,所以,今天把文章又重新修改了,增加 ...
- 后盾网lavarel视频项目---lavarel多表关联一对多操作实例
后盾网lavarel视频项目---lavarel多表关联一对多操作实例 一.总结 一句话总结: 1.一对多中多那个部分的数据前端通过json弄到服务器 2.所有通过一操作多的时候,都要用上模型中定义的 ...
- MapReduce编程(五) 单表关联
一.问题描述 下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格. 输入文件内容如下: child parent Steven Lucy Steven Jack ...
- 大主子表关联的性能优化方法
[摘要] 主子表是数据库最常见的关联关系之一,最典型的包括合同和合同条款.订单和订单明细.保险保单和保单明细.银行账户和账户流水.电商用户和订单.电信账户和计费清单或流量详单.当主子表的数据量较大时, ...
- sql语句语法多表关联_SQL Delete语句-如何删除行或表,语法示例
sql语句语法多表关联 To delete a record in a table you use the DELETE statement. 要删除表中的记录,请使用DELETE语句. Be c ...
- MySQL百万级、千万级数据多表关联SQL语句调优
本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万级数据表关联查询第一页结果能在2秒内完成(真实业务告警系统优化结果). 希望读者能够理解 ...
- mysql面试关联查询语句_MySQL百万级、千万级数据多表关联SQL语句调优
作者:成金之路 www.cnblogs.com/uttu/p/6384541.html 本文不涉及复杂的底层数据结构,通过explain解释SQL,并根据可能出现的情况,来做具体的优化,使百万级.千万 ...
- Oracle\MS SQL Server的数据库多表关联更新UPDATE与多表更新
一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表 一.MS S ...
- 使用外部表关联MySQL数据到Oracle
因为业务需要,有个临时的活动需要DBA来支持一些数据业务,问题来了,需要从MySQL端同步一部分数据到Oracle端,然后从Oracle端匹配查到相应的数据返回给MySQL,至于原因,也是不同的业务系 ...
最新文章
- 探索 COVID-19 新冠数据来学习 Pandas
- 关于虚函数(多态)与继承的一道搜狗笔试题
- STM32 基础系列教程 31 – DAC
- 爱玛士关于爬虫的scrapy框架的心得
- mysql 字符串中取整_MySQL取整
- python 元类 type_python Class:面向对象高级编程 元类:type
- 高校云计算机中心建设方案,最新某大学云数据中心建设方案.pdf
- Entity Framework教程(第二版)
- TCP三次握手四次挥手介绍
- linux将passwd文件拷贝到,Linux命令
- Struts2.0 + Spring2.5 + Hibernate3.3开发环境的配置(1)
- matlab的基本语法规则_Matlab基本语法与指令
- 收款码三合一生成系统源码
- Unity3D脚本中文系列教程(八)
- 在线运行python的网站-Python在线练习运行平台
- 如何快速找出一个数组中最大数和第二大数
- MTK 开发流程和开发环境
- 一个精英的诞生,家庭因素有多大?
- 什么是全景图?如何进行vr全景图拍摄
- cefsharp实现双屏显示网页(横屏|竖屏)可拖动分隔条