多联表

框架支持多连表模型,DAO类都有join(全联接),leftJoin(左联接),rightJoin(右联接)方法

参数为联接关系

  1. // on `user`.`projectId` = `project`.`id` and `user`.`type` = `project`.`type`
  2. $DAO = $this->userDAO->join($this->projectDAO, array('projectId'=>'id', 'type'=>'type'));

$DAO可以继续联接,联接第三个表时,联接关系为二维数组,第一个数组对应第一张表与新表关系,第二个数组对应第二张表与新表关系

  1. // on `user`.`testId` = `test`.`id` and `project`.`type` = `test`.`status`
  2. $DAO = $DAO->leftJoin($this->testDAO, array(
  3. array('testId'=>'id'),
  4. array('type'=>'status')
  5. ));

可以继续联接,联接关系同样为二维数组,三个对象分别对应原表与新表关系,无关联则为空,最后的空数组可以省略

  1. // on `project`.`message` = `message`.`name`
  2. $DAO = $DAO->rightJoin($this->messageDAO, array(
  3. array(),
  4. array('message'=>'name'),
  5. // array()
  6. ));

以此类推,理论上可以建立任意数量的关联表

参数有两种写法,上面那种是位置对应表,另外可以根据别名做对应,别名即DAO之前的字符串

  1. // on `project`.`message` = `message`.`name` and `user`.`mId` = `message`.`id`
  2. $DAO = $DAO->rightJoin($this->messageDAO, array(
  3. 'project' => array('message'=>'name'),
  4. 'user' => array('mId'=>'id'),
  5. ));

多联表同样可以使用queryfindcount等查询语句。参数则改为二维数组

和联表参数一样,参数有两种写法,一种是位置对应表,另一种即别名对应表,同样也可以混合使用。

  1. // SELECT `user`.`id` AS 'uId', `user`.`cash`, `project`.`createTime` FROM ...
  2. $this->userDAO->join($this->projectDAO, array('projectId'=>'id'))
  3. ->query(array(
  4. array('id'=>'uId', 'cash'),
  5. 'project' => array('createTime'),
  6. ));

联表条件中有时需要用到等于固定值的情况,可以通过on方法添加

  1. // ... on `user`.`projectId` = `project`.`id` and `user`.`type` = 10 and `project`.`cash` > 100
  2. $this->userDAO->join($this->projectDAO, array('projectId'=>'id'))
  3. ->on(array(
  4. array('type'=>10),
  5. array('cash'=>array('>', 100)),
  6. ))->query();

多联表的查询和修改(update),和单表操作基本一致,需要注意的是单表参数为一维数组,多表则为二维数组,写错会导致执行失败。

注意:多联表中的选择器应该使用二维数组,例如:

  1. // ... where `user`.`type` = 10 and `project`.`cash` = 100
  2. $this->userDAO->join($this->projectDAO, array('projectId'=>'id'))
  3. ->filter(array(
  4. array('type'=>10),
  5. array('cash'=>100),
  6. ))->query();

具体选择器使用请参考选择器文档内容。

Biny 2.8.6之后join/leftJoin/rightJoin可以在第一张表添加选择器后再使用,使用方法如下:

  1. // ... where `user`.`type` = 10
  2. $this->userDAO->filter(array('type'=>10))
  3. ->join($this->projectDAO, array('projectId'=>'id'))
  4. ->query();
  5. // 等同于下方原来的写法,这样在第一张表中参数会自动带入到联表参数中
  6. $this->userDAO->join($this->projectDAO, array('projectId'=>'id'))
  7. ->filter(array(
  8. array('type'=>10),
  9. ))->query();