Пытаюсь сделать scan в dynamodb, с использованием PHP и пакета aws/aws-sdk-php Мне нужно найти непрочитанные уведомления для определенных аккаунтов. Кроме того, уведомления должны быть определнных типов. Аккаунтов и типов может быть несколько.
Вот как я пытаюсь это делать на PHP
public function getUnreadNotifications($accountIds): array
{
$expressionValues = $this->marshaler->marshalItem([
':readStatus' => Notification::STATUS_NOT_READ
]);
$params = [
'FilterExpression' => 'read_status = :readStatus'
];
/**
* Добавляем выборку по типу
*/
$typeKeys = [];
foreach (Notification::TYPES as $typeIndex => $type) {
$typeKeys[':type_' . $typeIndex] = $this->marshaler->marshalValue($type);
}
$accountIdKeys = [];
foreach ($accountIds as $accountIdIndex => $accountId) {
$accountIdKeys[':account_id_' . $accountIdIndex] = $this->marshaler->marshalValue($accountId);
}
$expressionValues = array_merge($expressionValues, $typeKeys, $accountIdKeys);
$params['FilterExpression'] .= sprintf(' and #type IN (%s) and #account_id IN (%s)',
implode(',', array_keys($typeKeys)),
implode(',', array_keys($accountIdKeys))
);
$params['ExpressionAttributeNames'] = [
'#type' => 'type',
'#account_id' => 'account_id',
];
$params = array_merge($params, [
'TableName' => $this->getTableName(),
'ExpressionAttributeValues' => $expressionValues,
]);
return $this->scan($params);
}
Однако в результате получаю пустой массив например для моего аккаунта
При этом запрос из консоли к dynamodb работает как надо
/usr/local/bin/aws dynamodb scan --table-name Notifications --expression-attribute-values '{":account_id_0":{"N":"15"}, ":readStatus":{"N":"0"}, ":type_0":{"S":"account_document_verified"}, ":type_1":{"S":"card_payment"}}' --expression-attribute-names '{"#type":"type", "#account_id":"account_id"}' --filter-expression "read_status = :readStatus and #type IN (:type_0,:type_1) and #account_id IN (:account_id_0)" --endpoint=http://localhost:8000
Как выглядит при этом массив $params
с параметрами для dynamodb из примера кода
'FilterExpression' =>
string(78) "read_status = :readStatus and #type IN (:type_0,:type_1) and #account_id IN ()"
'ExpressionAttributeNames' =>
array(2) {
'#type' =>
string(4) "type"
'#account_id' =>
string(10) "account_id"
}
'TableName' =>
string(13) "Notifications"
'ExpressionAttributeValues' =>
array(3) {
':readStatus' =>
array(1) {
'N' =>
string(1) "0"
}
':type_0' =>
array(1) {
'S' =>
string(25) "account_document_verified"
}
':type_1' =>
array(1) {
'S' =>
string(12) "card_payment"
}
}
}
Что я делаю не так? Ведь то, что я составил на PHP по идее идентично чистому запросу.
Правильный ответ: нужно было сканировать таблицу с использованием LastEvaluatedKey
Прошу помощиМне необходимо посылать данные из php7
Подскажите пожалуйста , как решить проблемуВвожу текст , жму F3 и программа завершается без расстановки
Есть код принятия данных с TcpClientОн работает в таске, имитирующем клиент, но не в классе клиента