laravel-dynamodb에서 Range Key의 BETWEEN 조건을 지정할 때의주의
결론
where($rangeKeyName, 'range', [$min, $max])
사용합시다 whereBetween()
사용 안함 확인 환경
baopham/laravel-dynamodb4.2.1
deangiberson/aws-dynamodb-local 의 docker image 사용
사전 조건
다음과 같은 테이블을 생각한다.
영화
AttributeName
KeyType
AttributeType
id
HASH
문자열
search_key
문자열
date
문자열
(이후에는 적절히 필요한 Attribute를 지정한다)
이 테이블에는 다음 GSI가 설정되어 있다고 가정합니다.
IndexName
HASH
RANGE
Projection
date_range
search_key
date
ALL
또,
App\Models\Movie
에 Baopham\DynamoDb\DynamoDbModel
를 계승한 Model 를 정의하고 있다고 한다.검증
search_key
+ date
의 GSI에서 date
에 BETWEEN을 지정하여 데이터를 검색합니다.(이번은 GSI에서 검색이 되지만, Hash Key + Range Key 테이블이나 LSI에서도 같다고 생각된다)
where(~,'between',~)
제대로 BETWEEN이 지정되어 Query입니다.
>>> App\Models\Movie::where('search_key', '1')->where('date', 'between', ['2017-01-01', '2018-01-01'])->toDynamoDbQuery()
=> BaoPham\DynamoDb\RawDynamoDbQuery {
+op: "Query",
+query: [
"IndexName" => "date_range",
"KeyConditionExpression" => "#search_key = :a1 AND (#date BETWEEN :a2 AND :a3)",
"ExpressionAttributeNames" => [
"#search_key" => "search_key",
"#date" => "date",
],
"ExpressionAttributeValues" => [
":a1" => [
"S" => "1",
],
":a2" => [
"S" => "2017-01-01",
],
":a3" => [
"S" => "2018-01-01",
],
],
"TableName" => "Movies",
],
}
whereBetween(~)
whereBetween()
가 유효하지 않은 것처럼 Range Key에서 필터링 조건이 지정되지 않고 Scan이됩니다.(예외 던져주었으면 좋겠어...)
>>> App\Models\Movie::where('search_key', '1')->whereBetween('date', ['2017-01-01', '2018-01-01'])->toDynamoDbQuery()
=> BaoPham\DynamoDb\RawDynamoDbQuery {
+op: "Scan",
+query: [
"FilterExpression" => "#search_key = :a1",
"ExpressionAttributeNames" => [
"#search_key" => "search_key",
],
"ExpressionAttributeValues" => [
":a1" => [
"S" => "1",
],
],
"TableName" => "Movies",
],
}
where(~)×2
단순히 AND로 연결한다. Scan이 되어 버린다.
>>> App\Models\Movie::where('search_key', '1')->where('date', '>', '2017-01-01')->where('date', '<', '2018-01-01')->toDynamoDbQuery()
=> BaoPham\DynamoDb\RawDynamoDbQuery {
+op: "Scan",
+query: [
"FilterExpression" => "#search_key = :a1 AND #date > :a2 AND #date < :a3",
"ExpressionAttributeNames" => [
"#search_key" => "search_key",
"#date" => "date",
],
"ExpressionAttributeValues" => [
":a1" => [
"S" => "1",
],
":a2" => [
"S" => "2017-01-01",
],
":a3" => [
"S" => "2018-01-01",
],
],
"TableName" => "Movies",
],
}
Reference
이 문제에 관하여(laravel-dynamodb에서 Range Key의 BETWEEN 조건을 지정할 때의주의), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/okashoi/items/21f311f22fb42cb7955b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)