游标数据

如果DB中取出的数据非常大,而PHP中却无法承受这么大量的内存可以用来处理,这时候就需要用到cursor游标了

游标可以将复合条件的数据逐一取出,在程序中进行分批处理,从而降低大数据所带来的内存瓶颈

  1. // 选择器,条件类模式完全一样,在获取数据时使用cursor方法
  2. $rs = $this->testDAO->filter(array('type'=>1))->cursor(array('id', 'name'));
  3. // 通过 Database::step 逐个取出data数据,e.g: ['id'=>2, 'name'=>'test']
  4. while ($data=Database::step($rs)){
  5. do something...
  6. }

如果在游标数据中需要再使用其他sql语句,则需要在cursor方法中传第二个参数false,否则在cursor未执行完之前其他语句无法执行

  1. // 选择器,条件类模式完全一样,在获取数据时使用cursor方法
  2. $rs = $this->testDAO->filter(array('type'=>1))->cursor(array('id', 'name'), false);
  3. // 通过 Database::step 逐个取出data数据,e.g: ['id'=>2, 'name'=>'test']
  4. while ($data=Database::step($rs)){
  5. // other sql...
  6. $count = $this->testDAO->count();
  7. }

如果使用SQL模版的话,也可以通过传递第三个参数Database::FETCH_TYPE_CURSOR来实现游标的使用

  1. // 使用方法跟上诉方式一样
  2. $rs = $this->testDAO->filter(array('type'=>1))
  3. ->select('SELECT * FROM :table WHERE :where AND status=:status', array('status'=>2), Database::FETCH_TYPE_CURSOR);
  4. // 通过 Database::step 逐个取出data数据,e.g: ['id'=>2, 'name'=>'test', 'type'=>1, 'status'=>2]
  5. while ($data=Database::step($rs)){
  6. do something...
  7. }

Biny 2.8.2之后cursor第二个参数可传匿名函数function作为数据回调使用,使用方法如下:

  1. $result = array();
  2. // $data为迭代的数据,$index为索引
  3. $this->testDAO->filter(array('type'=>1))
  4. ->cursor('*', function($data, $index) use(&$result){
  5. do something...
  6. });