Microsoft Azure Storage Pagination запрос

$filter = " ( redemption_code eq '1001')  ";
$result = $tableRestProxy->queryEntities("Redemptions", $filter);
$entities = $result->getEntities();

foreach($entities as $entity){}

Этот запрос хранилища Microsoft Azure отлично работает и возвращает тысячи записей из таблицы погашений. Можете ли вы помочь мне, как я могу использовать параметры запуска и ограничения для пагинации в нем.

0

Решение

Вы можете использовать QueryEntitiesOptions для запросов и нумерации страниц. Как правило, вы можете использовать SetTop ($ сверху) чтобы выбрать верхние (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 />";
}

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

Я погрузился в исходный код, найти $filter строка не была установлена ​​в $queryParam в строка 1008 таблицы TableRestProxy.php из-за $filter строка не соответствует условному stsm в _buildFilterExpressionRec().

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

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

Другие решения

Вы можете увидеть демо для Как выполнять запросы и нумерацию страниц для хранилища таблиц Azure в 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;
}
}

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

введите описание изображения здесь

0