Google Cloud Datastore APIをPHPから使ってみる（データ取得）

GoogleのDatastoreにPHPからアクセスしようとしたところ、あまり情報が無かったのでメモ

# PHP client library (Beta)の取得

[GithubのGoogleアカウント](https://github.com/google/google-api-php-client)から取得

# OAuth
[Google Developers Console](https://console.developers.google.com/)からプロジェクトを選択し、

- APIs & auth（APIと認証）- Credentials（認証情報）
- Create new Client ID（新しいクライアントIDを作成）
- Service account（サービスアカウント）を選択
- JSON Key（JSONキー）

の順に選択すると、認証情報の入ったJSONファイルがダウンロードされる。
今回は、サーバ上で実行するプログラムのため、Service accountを選択。

JSONの中身はこのような形。

```json
{
  "private_key_id": "******",
  "private_key": "***",
  "client_email": "***@developer.gserviceaccount.com",
  "client_id": "***.apps.googleusercontent.com",
  "type": "service_account"
}
```

# 認証

ダウンロードしたClient libraryの中のGoogleフォルダ内にautoload.phpがあるので、これを読み込むと、オートローディングが使用できるようになる。

認証は、ダウンロードしたjsonファイルのパスと、使用するサービスのスコープを指定して、`Google_Client::loadServiceAccountJson()`メソッドを呼ぶ。

サーバ上ではなく、通常のOAuth2認証などを使用する場合は、`Google_Client::setAuthConfig()`メソッドを呼んで認証する。

スコープは、Datastoreを使用するため、`Google_Service_Datastore::DATASTORE`と`Google_Service_Datastore::USERINFO_EMAIL`が必要。

```php
require_once 'Google/autoload.php';

$client = new Google_Client();

$scopes = [
    Google_Service_Datastore::DATASTORE,
    Google_Service_Datastore::USERINFO_EMAIL,
];
$configFile = '***.json';
$credentials = $client->loadServiceAccountJson($configFile, $scopes);

$client->setAssertionCredentials($credentials);
```

# Datastoreのオブジェクトを取得

```php
$service = new Google_Service_Datastore($client);

```

# データの取得

Datastoreオブジェクトが取得できれば、Kindを指定してRunQueryRequestのオブジェクトを作成、datasetIdを指定して、`runQuery()`メソッドを実行すればデータの取得ができる。

```php
$kind = new Google_Service_Datastore_KindExpression();
$kind->setName('Kind名');

$query = new Google_Service_Datastore_Query();
$query->setKinds(array($kind));

$request = new Google_Service_Datastore_RunQueryRequest();
$request->setQuery($query);

$result = $service->datasets->runQuery('datasetId', $request);
```

# フィルター

```php
$propertyFilter = new Google_Service_Datastore_PropertyFilter();
$propertyReference = new Google_Service_Datastore_PropertyReference();
$propertyReference->setName("カラム名");

$propertyFilterValue = new Google_Service_Datastore_Value();
$propertyFilterValue->setStringValue("値");

$propertyFilter->setProperty($propertyReference);
$propertyFilter->setOperator('EQUAL');
$propertyFilter->setValue($propertyFilterValue);

$filter = new Google_Service_Datastore_Filter();
$filter->setPropertyFilter($propertyFilter);

$query->setFilter($filter);
```

# ID/KeyNameから取得

Datastoreを使用する上で大事なID/KeyNameからの取得。
`$path->setName()`すると、KeyNameから取得可能。

```php
$path = new Google_Service_Datastore_KeyPathElement();
$path->setKind('Kind名');
$path->setId('***');

$key = new Google_Service_Datastore_Key();
$key->setPath([$path]);

$request = new Google_Service_Datastore_LookupRequest();
$request->setKeys([$key]);

$result = $service->datasets->lookup('datasetId', $request);
```

# GQL

GQLを使用したデータ取得も可能。

```php
$service = new Google_Service_Datastore($client);

$query = "SELECT * FROM Kind名";
$gql = new Google_Service_Datastore_GqlQuery();
$gql->setQueryString($query);

$request = new Google_Service_Datastore_RunQueryRequest();
$request->setGqlQuery($gql);

$result = $service->datasets->runQuery('datasetId', $request);
```