2017-08-15 73 views
0

我正在尝试为大型结果集使用游标。该文档表明你可以使用游标与GQL查询使用PHP,但我似乎无法得到它的工作。带限制和偏移游标的谷歌数据存储gql查询?

有没有人有此工作?如果它不适用于GQL查询,有人能告诉我一个如何实现这个的例子吗?

$query = $datastore->gqlQuery('SELECT * FROM h_stats WHERE field1 = @parm1 AND date >= @startDate AND date < @endDate LIMIT @limitBy OFFSET @cursor', [ 
            'bindings' => [ 
            'parm1' => '5700305828184064', 
            'startDate' => '1501545600', 
            'endDate' => '1501632000', 
            'limitBy' => 10, 
            'cursor' => 'CURSOR_STRING_HERE' 
            ] 
    ]); 

回答

0

我想通了。我无法从GQL查询中找到这种可能。但是可以从普通查询中获得。

希望这可以帮助别人,因为谷歌文档是非常糟糕的例子。

$datastore = new Google\Cloud\Datastore\DatastoreClient([ 
    'projectId' => $projectId, 
]); 


    function cursor_paging($datastore, $queryKind, $pageSize, $parm1, $startDate, $endDate, $pageCursor = '') 
    { 

     $query = $datastore->query() 
      ->kind($queryKind) 
      ->filter('field1', '=', $parm1) 
      ->filter('date', '>=', $startDate) 
      ->filter('date', '<', $endDate) 
      ->limit($pageSize) 
      ->start($pageCursor);  

     $result = $datastore->runQuery($query); 
     $nextPageCursor = ''; 
     $entities = []; 

     foreach ($result as $entity) { 
      $nextPageCursor = $entity->cursor(); 
      $entities[] = $entity; 
     } 
     return array(
      'nextPageCursor' => $nextPageCursor, 
      'entities' => $entities 
     ); 

    } 

这就是我在Google云数据存储区php文档中提供的这个函数使用它的方式。

$pageSize = 500; 
    $queryKind = "your_kind"; 
    $result = cursor_paging($datastore, $queryKind, $pageSize, $currentThermostat, $startDate, $endDate); 

    $countRows = 0; 

    for ($x=0; $x < $pageSize; $x++) { 

     $counter = 0; 

     foreach ($result['entities'] as $item) { 
      print($countRows . " " . $item['data']); 
      $countRows++; 
      $counter++; 
     } 

     $result = cursor_paging($datastore, $queryKind, $pageSize, $currentThermostat, $startDate, $endDate, $result['nextPageCursor']); 

     if ($counter > 0) { 
      $x = 0; 
     } else { 
      $x = $pageSize; //exit loop when no more results 
     } 
    }