Я использую это:
https://github.com/Azure/azure-storage-table-php
для вставки данных в таблицу Azure.
Однако, когда я получаю данные, я не получаю последние записи, если не использую цикл do... while, как показано в разделе комментариев функции ниже.
Мой вопрос это:
Как получить последние данные при использовании нумерации страниц? Я хочу, чтобы самые новые записи всегда появлялись в списке первыми, а затем использовался токен продолжения для загрузки следующего набора результатов. Я не хочу использовать do.. while, поскольку он сразу получит все данные из таблицы Azure.
Я также реализовал эту функцию (invertedTicksRowKey), чтобы использовать значение в качестве rowKey:
function invertedTicksRowKey(): string
{
$now = new DateTime('now', new DateTimeZone('UTC'));
$ticks = ($now->format('U') * 10000000) + ($now->format('u') * 10) + 621355968000000000;
$inverted = 9223372036854775807 - $ticks;
$suffix = bin2hex(random_bytes(4)); // 8-char hex
return str_pad($inverted, 19, "0", STR_PAD_LEFT) . '-' . $suffix;
}
public function get_table_data(string $tableName, int $pageSize = 1000, ?TableContinuationToken $continuationToken = null, $filter = []): array
{
try {
$allData = [];
$token = $continuationToken;
//do {
$options = new QueryEntitiesOptions();
$options->setTop($pageSize);
// Build combined filter
$filters = [];
if (!empty($filter['date_range_filter'])) {
$filters[] = $filter['date_range_filter'];
}
if (!empty($filter['function'])) {
$filters[] = "PartitionKey eq '" . $filter['function'] . "'";
}
if ($filters) {
$filterString = implode(' and ', $filters);
$options->setFilter(Filter::applyQueryString($filterString));
}
if ($token) {
$options->setContinuationToken($token);
}
$result = $this->_tableClient->queryEntities($tableName, $options);
$token = $result->getContinuationToken();
$entities = $result->getEntities();
foreach ($entities as $entity) {
$row = [];
foreach ($entity->getProperties() as $key => $prop) {
$row[$key] = $prop->getValue();
}
$row['PartitionKey'] = $entity->getPartitionKey();
$row['RowKey'] = $entity->getRowKey();
$row['Timestamp'] = $entity->getTimestamp();
$allData[] = $row;
}
//} while ($token !== null);
// Sort newest first by RowKey (smallest = newest)
usort($allData, fn($a, $b) => strcmp($a['RowKey'], $b['RowKey']));
return [
'data' => $allData,
'continuationToken' => $token
];
} catch (\Exception $e) {
log_message('error', 'Azure Table query failed: ' . $e->getMessage());
return ['data' => [], 'continuationToken' => null];
}
}
Подробнее здесь: https://stackoverflow.com/questions/798 ... pagination