$filter = " ( redemption_code eq '1001') ";
$result = $tableRestProxy->queryEntities("Redemptions", $filter);
$entities = $result->getEntities();
foreach($entities as $entity){}
Этот запрос хранилища Microsoft Azure отлично работает и возвращает тысячи записей из таблицы погашений. Можете ли вы помочь мне, как я могу использовать параметры запуска и ограничения для пагинации в нем.
Вы можете использовать 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);
Вы можете увидеть демо для Как выполнять запросы и нумерацию страниц для хранилища таблиц 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;
}
}
Демонстрация выглядит следующим образом: