Cloud Datastore API - php - GqlQuery - Binding args

565 views Asked by At

I'm trying to bind some arguments to my GQL query string. Everything's fine when I run the query without binding anything:

$result = $DB->query_entities("SELECT * FROM kind WHERE fieldName = 4 LIMIT 1");

But I don't know how to bind some arguments. This is how I'm trying to do so:

function query_entities($query_string, $args=[]){       
    $gql_query = new Google_Service_Datastore_GqlQuery();
    $gql_query->setQueryString($query_string);
    $gql_query->setAllowLiteral(true);

    if( !empty($args) ){
        $binding_args = [];

        foreach ($args as $key => $value) {
            $binding_value = new Google_Service_Datastore_Value();
            $binding_value->setIntegerValue($value);

            $arg = new Google_Service_Datastore_GqlQueryArg();
            $arg->setName($key);
            $arg->setValue($binding_value);

            $binding_args[] = $arg;
        }

        $gql_query->setNameArgs($binding_args);
    }

        $req = new Google_Service_Datastore_RunQueryRequest();
        $req->setGqlQuery($gql_query);

        return $this->dataset->runQuery($this->dataset_id, $req, []);
}

$exampleValue = 4;

$result = $DB->query_entities("SELECT * FROM kind WHERE fieldName = :fieldName LIMIT 1", ["fieldName" => $exampleValue]);

Or:

function query_entities($query_string, $args=[]){       
    $gql_query = new Google_Service_Datastore_GqlQuery();
    $gql_query->setQueryString($query_string);
    $gql_query->setAllowLiteral(true);

    if( !empty($args) ){
        $binding_args = [];

        foreach ($args as $value) {
            $binding_value = new Google_Service_Datastore_Value();
            $binding_value->setIntegerValue($value);

            $arg = new Google_Service_Datastore_GqlQueryArg();
            $arg->setValue($binding_value);

            $binding_args[] = $arg;
        }

        $gql_query->setNumberArgs($binding_args);
    }

        $req = new Google_Service_Datastore_RunQueryRequest();
        $req->setGqlQuery($gql_query);

        return $this->dataset->runQuery($this->dataset_id, $req, []);
}

$exampleValue = 4;

$result = $DB->query_entities("SELECT * FROM kind WHERE fieldName = :1 LIMIT 1", [$exampleValue]);

This is what I get: 'Error calling POST https://www.googleapis.com/datastore/v1beta2/datasets/age-of-deployment/runQuery: (400) Lexical error at line 1, column 52. Encountered: ":" (58), after : ""' in ...

1

There are 1 answers

6
Ed Davisson On BEST ANSWER

Cloud Datastore GQL and Python GQL (App Engine) handle argument binding slightly differently.

In this case, you need to use a @ instead of a :, for instance:

SELECT * FROM kind WHERE fieldName = @fieldName LIMIT 1

or

SELECT * FROM kind WHERE fieldName = @1 LIMIT 1

Here's the reference documentation for argument binding in Cloud Datastore GQL.