多联表
框架支持多连表模型,DAO类都有join
(全联接),leftJoin
(左联接),rightJoin
(右联接)方法
参数为联接关系
// on `user`.`projectId` = `project`.`id` and `user`.`type` = `project`.`type` $DAO =$this ->userDAO ->join ($this ->projectDAO ,array ('projectId' =>'id' ,'type' =>'type' ));
$DAO
可以继续联接,联接第三个表时,联接关系为二维数组,第一个数组对应第一张表与新表关系,第二个数组对应第二张表与新表关系
// on `user`.`testId` = `test`.`id` and `project`.`type` = `test`.`status` $DAO =$DAO ->leftJoin ($this ->testDAO ,array (array ('testId' =>'id' ),array ('type' =>'status' )- ));
可以继续联接,联接关系同样为二维数组,三个对象分别对应原表与新表关系,无关联则为空,最后的空数组可以省略
// on `project`.`message` = `message`.`name` $DAO =$DAO ->rightJoin ($this ->messageDAO ,array (array (),array ('message' =>'name' ),// array() - ));
以此类推,理论上可以建立任意数量的关联表
参数有两种写法,上面那种是位置对应表,另外可以根据别名
做对应,别名
即DAO之前的字符串
// on `project`.`message` = `message`.`name` and `user`.`mId` = `message`.`id` $DAO =$DAO ->rightJoin ($this ->messageDAO ,array ('project' =>array ('message' =>'name' ),'user' =>array ('mId' =>'id' ),- ));
多联表同样可以使用query
,find
,count
等查询语句。参数则改为二维数组
。
和联表参数一样,参数有两种写法,一种是位置对应表,另一种即别名
对应表,同样也可以混合使用。
// SELECT `user`.`id` AS 'uId', `user`.`cash`, `project`.`createTime` FROM ... $this ->userDAO ->join ($this ->projectDAO ,array ('projectId' =>'id' ))- ->
query (array (array ('id' =>'uId' ,'cash' ),'project' =>array ('createTime' ),- ));
联表条件中有时需要用到等于固定值的情况,可以通过on
方法添加
// ... on `user`.`projectId` = `project`.`id` and `user`.`type` = 10 and `project`.`cash` > 100 $this ->userDAO ->join ($this ->projectDAO ,array ('projectId' =>'id' ))- ->
on (array (array ('type' =>10),array ('cash' =>array ('>' , 100)),- ))->
query ();
多联表的查询和修改(update
),和单表操作基本一致,需要注意的是单表参数为一维数组
,多表则为二维数组
,写错会导致执行失败。
注意:
多联表中的选择器应该使用二维数组,例如:
// ... where `user`.`type` = 10 and `project`.`cash` = 100 $this ->userDAO ->join ($this ->projectDAO ,array ('projectId' =>'id' ))- ->
filter (array (array ('type' =>10),array ('cash' =>100),- ))->
query ();
具体选择器使用请参考选择器文档内容。
Biny 2.8.6之后join/leftJoin/rightJoin
可以在第一张表添加选择器后再使用,使用方法如下:
// ... where `user`.`type` = 10 $this ->userDAO ->filter (array ('type' =>10))- ->
join ($this ->projectDAO ,array ('projectId' =>'id' ))- ->
query ();// 等同于下方原来的写法,这样在第一张表中参数会自动带入到联表参数中 $this ->userDAO ->join ($this ->projectDAO ,array ('projectId' =>'id' ))- ->
filter (array (array ('type' =>10),- ))->
query ();