2016-04-16 3 views
0
$filter = " (redemption_code eq '1001') ";  
$result = $tableRestProxy->queryEntities("Redemptions", $filter); 
$entities = $result->getEntities(); 

foreach($entities as $entity){ 


} 

Этот запрос на хранение azure в Microsoft работает идеально и возвращает тысячи записей из таблицы Redemptions. не могли бы вы помочь мне, как я могу использовать параметр start и limit для разбивки на страницы.Microsoft azure storage pagination query

ответ

0

Вы можете использовать QueryEntitiesOptions для запросов и разбивки на страницы. Как правило, вы можете использовать setTop($top), чтобы выбрать верхние (N) сущности из таблицы, а затем использовать свойство _nextPartitionKey запроса функции queryEntities() для следующих (N) объектов.

Вот фрагмент кода:

$tableRestProxy = ServicesBuilder::getInstance()->createTableService($connectionString); 

$options = new QueryEntitiesOptions(); 
$filter = " (redemption_code eq '1001') "; 
$options->setFilter($filter); 
$options->setTop(100); 
try { 
    $result = $tableRestProxy->queryEntities("Redemptions", $options); 
} catch (ServiceException $e) { 
    $code = $e->getCode(); 
    $error_message = $e->getMessage(); 
    echo $code . ": " . $error_message . "<br />"; 
} 

//query next 100 entities 
$nextRowKey = $result->getNextRowKey(); 
$nextPartitionKey = $result->getNextPartitionKey(); 
$options->setNextRowKey($nextRowKey); 
$options->setNextPartitionKey($nextPartitionKey); 
try { 
    $next_result = $tableRestProxy->queryEntities("Redemptions", $options); 
} catch (ServiceException $e) { 
    $code = $e->getCode(); 
    $error_message = $e->getMessage(); 
    echo $code . ": " . $error_message . "<br />"; 
} 

Update

После серии испытаний, он будет работать как с использованием setFilter и setTop в то же время, если строка фильтра не RowKey, я использовал пользовательский столбец в строке $filter, он отлично работает. Но когда я использую RowKey столбец в $filter и функцию setTop в то же время, это поднимает вашу проблему.

Я нырнул в исходный код, найти $filter строка не была установлена ​​в $queryParamline 1008 of TableRestProxy.php в связи с $filter строки не соответствует ни условной СЦМ в _buildFilterExpressionRec().

Итак, вы можете попытаться использовать QueryStringFilter instance для установки строки фильтра. Попробуйте следующий код:

use WindowsAzure\Table\Models\Filters\QueryStringFilter; 
use WindowsAzure\Table\Models\QueryEntitiesOptions; 
$options = new QueryEntitiesOptions(); 
$filter = new QueryStringFilter("(RowKey eq 'E1591D1')"); 
$options->setFilter($filter); 
$options->setTop(5); 
+0

Если я использую SetTop() theh фильтр не может Работа. иначе фильтр работает идеально. –

+0

QueryEntitiesOptions может использовать 'setFilter' и' setTop' в то время, он отлично работает на моей стороне. Не могли бы вы обновить фрагмент кода проблемы, чтобы мы могли воспроизвести вашу проблему? –

+0

'code' $ options = new QueryEntitiesOptions(); $ filter = "(RowKey eq 'E1591D1')"; $ options-> setFilter ($ filter); $ options-> setTop (5); $ tableRestProxy-> queryEntities ("Redemptions", $ options); - Использование этого кода не может работать. 'code' $ filter =" (redemption_code eq '1001') "; $ result = $ tableRestProxy-> queryEntities ("Redemptions", $ filter); $ entities = $ result-> getEntities(); - Это работает отлично –

0

Вы можете увидеть демонстрацию How to do queries and pagination for Azure Table Storage in PHP

function queryPaginationEntitiesSample($tableClient, $tableName, $numPerPage, $page, $filter) 
{ 
try { 
    $options = new QueryEntitiesOptions(); 
    $options->setFilter(Filter::applyQueryString($filter)); 
    if($page== 1){ 
     $options->setTop($numPerPage); 
     $result = $tableClient->queryEntities($tableName, $options); 
     $entities = $result->getEntities(); 
    } 
    else{ 
     //skip $numPerPage * ($page-1) records 
     $options->setTop($numPerPage * ($page-1)); 
     $options->setSelectFields(array('pk')); 
     $result = $tableClient->queryEntities($tableName, $options); 
     $nextRowKey = $result->getNextRowKey(); 
     $nextPartitionKey = $result->getNextPartitionKey(); 

     $options = new QueryEntitiesOptions(); 
     $options->setFilter(Filter::applyQueryString($filter)); 
     $options->setTop($numPerPage); 
     $options->setNextRowKey($nextRowKey); 
     $options->setNextPartitionKey($nextPartitionKey); 
     $result = $tableClient->queryEntities($tableName, $options); 
     $entities = $result->getEntities(); 
    } 

    return $entities; 
} 
catch(ServiceException $e){ 
    $code = $e->getCode(); 
    $error_message = $e->getMessage(); 
    echo $code.": ".$error_message.PHP_EOL; 
    return null; 
} 
} 

Демонстрация выглядит следующим образом:

enter image description here

+0

Я пробовал этот пример pagination, и он работает ... пока вы не дойдете до конца своих данных. У меня около 2500 записей в таблице. Страница 1 и 2 работают нормально, но когда я вызываю страницу 3, я получаю запрос 400 - Bad: один из входов запроса недействителен – Talon

Смежные вопросы