laravel-dynamodb에서 Range Key의 BETWEEN 조건을 지정할 때의주의

10047 단어 PHP라라벨DynamoDB

결론


  • where($rangeKeyName, 'range', [$min, $max]) 사용합시다
  • whereBetween() 사용 안함

  • 확인 환경


  • PHP 7.0.26
  • Laravel 5.4.31

  • baopham/laravel-dynamodb4.2.1
  • DynamoDB Local

  • 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\MovieBaopham\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",
         ],
       }
    

    좋은 웹페이지 즐겨찾기