选择器

DAO类都可以调用filter(与选择器),merge(或选择器),效果相当于筛选表内数据

同样选择器支持单表和多表操作,参数中单表为一维数组,多表则为二维数组

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

而用merge或选择器筛选,条件则用or相连接

  1. // ... WHERE `user`.`id` = 1 OR `user`.`type` = 'admin'
  2. $merge = $this->userDAO->merge(array('id'=>1, 'type'=>'admin'));

同样多表参数也可用别名对应表,用法跟上面一致,这里就不展开了

  1. // ... WHERE `user`.`id` = 1 AND `project`.`type` = 'outer'
  2. $filter = $this->userDAO->join($this->projectDAO, array('projectId'=>'id'))
  3. ->filter(array(
  4. array('id'=>1),
  5. array('type'=>'outer'),
  6. ));

$filter条件可以继续调用filter/merge方法,条件会在原来的基础上继续筛选

  1. // ... WHERE (...) OR (`user`.`name` = 'test')
  2. $filter = $filter->merge(array('name'=>'test');

$filter条件也可以作为参数传入filter/merge方法。效果为条件的叠加。

  1. // ... WHERE (`user`.`id` = 1 AND `user`.`type` = 'admin') OR (`user`.`id` = 2 AND `user`.`type` = 'user')
  2. $filter1 = $this->userDAO->filter(array('id'=>1, 'type'=>'admin');
  3. $filter2 = $this->userDAO->filter(array('id'=>2, 'type'=>'user'));
  4. $merge = $filter1->merge($filter2);

无论是与选择器还是或选择器,条件本身作为参数时,条件自身的DAO必须和被选择对象的DAO保持一致,否者会抛出异常

值得注意的是filtermerge的先后顺序对条件筛选是有影响的

可以参考下面这个例子

  1. // WHERE (`user`.`id`=1 AND `user`.`type`='admin') OR `user`.`id`=2
  2. $this->userDAO->filter(array('id'=>1, 'type'=>'admin')->merge(array('id'=>2));
  3.  
  4. // WHERE `user`.`id`=2 AND (`user`.`id`=1 AND `user`.`type`='admin')
  5. $this->userDAO->merge(array('id'=>2))->filter(array('id'=>1, 'type'=>'admin');

由上述例子可知,添加之间关联符是跟后面的选择器表达式保持一致

选择器获取数据跟DAO方法一致,单表的选择器具有单表的所有查询,删改方法,而多表的选择器具有多表的所有查询,修改方法

  1. // UPDATE `DATABASE`.`TABLE` AS `user` SET `user`.`name` = 'test' WHERE `user`.`id` = 1
  2. $result = $this->userDAO->filter(array('id'=>1)->update(array('name'=>'test'));
  3.  
  4. // SELECT * FROM ... WHERE `project`.`type` = 'admin'
  5. $result = $this->userDAO->join($this->projectDAO, array('projectId'=>'id'))
  6. ->filter(array(array(),array('type'=>'admin')))
  7. ->query();

另外,如果想实现where start=end或者where start=end+86400这类的条件也是支持的,方法如下:

  1. // ... WHERE `user`.`lastLoginTime` = `user`.`registerTime` and `user`.`lastLoginTime` <= refreshTime+86400
  2. $filter = $this->userDAO->filter(array(
  3. 'lastLoginTime'=>Database::field('`user`.`registerTime`'),
  4. '<='=>array('lastLoginTime'=>Database::field('refreshTime+86400')),
  5. ));

无论是filter还是merge,在执行SQL语句前都不会被执行,不会增加sql负担,可以放心使用。