复杂选择

除了正常的匹配选择以外,filtermerge里还提供了其他复杂选择器。

如果数组中值为数组的话,会自动变为in条件语句

  1. // WHERE `user`.`type` IN (1,2,3,'test')
  2. $this->userDAO->filter(array('id'=>array(1,2,3,'test')));

其他还包括 ><>=<=!=<>isis not ,同样,多表的情况下需要用二维数组去封装

  1. // WHERE `user`.`id` >= 10 AND `user`.`time` >= 1461584562 AND `user`.`type` is not null
  2. $filter = $this->userDAO->filter(array(
  3. '>='=>array('id'=>10, 'time'=>1461584562),
  4. 'is not'=>array('type'=>NULL),
  5. ));
  6.  
  7. // WHERE `user`.`id` != 3 AND `user`.`id` != 4 AND `user`.`id` != 5
  8. $filter = $this->userDAO->filter(array(
  9. '!='=>array('id'=>array(3, 4, 5))
  10. ));

另外,like语句也是支持的,可匹配正则符的开始结尾符,具体写法如下:

  1. // WHERE `user`.`name` LIKE '%test%' OR `user`.`type` LIKE 'admin%' OR `user`.`type` LIKE '%admin'
  2. $filter = $this->userDAO->merge(array(
  3. '__like__'=>array('name'=>'test', 'type'=>'^admin', 'type'=>'admin$'),
  4. ));
  5.  
  6. // WHERE `user`.`name` LIKE '%test%' OR `user`.`name` LIKE 'admin%' OR `user`.`name` LIKE '%demo'
  7. $filter = $this->userDAO->merge(array(
  8. '__like__'=>array(
  9. 'name'=>array('test', '^admin', 'demo$'),
  10. )
  11. ));

not in语法暂时并未支持,可以暂时使用多个!=或者<>替代

同时filter/merge也可以被迭代调用,以应对不确定筛选条件的复杂查询

  1. // 某一个返回筛选数据的Action
  2. $DAO = $this->userDAO;
  3. if ($status=$this->param('status')){
  4. $DAO = $DAO->filter(array('status'=>$status));
  5. }
  6. if ($startTime=$this->param('start', 0)){
  7. $DAO = $DAO->filter(array('>='=>array('start'=>$startTime)));
  8. }
  9. if ($endTime=$this->param('end', time())){
  10. $DAO = $DAO->filter(array('<'=>array('end'=>$endTime)));
  11. }
  12. // 获取复合条件数量
  13. $count = $DAO->count();
  14. // 获取复合条件前10条数据
  15. $data = $DAO->limit(10)->query();