Skip to content

Instantly share code, notes, and snippets.

@koriym
Last active May 31, 2020 11:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koriym/d0d716a3c2a9fee95426b6a7aeb390e6 to your computer and use it in GitHub Desktop.
Save koriym/d0d716a3c2a9fee95426b6a7aeb390e6 to your computer and use it in GitHub Desktop.
(Ray.QueryModule) SQL実行入出力の連組配列をarray shapeでタイプする
  • SQL実行の入出力の連想配列をarray shapeでタイプする例です
  • $ageで指定されたユーザーリストがusers_by_age.sqlのSQL実行され結果(array<array{id: string, name: string}>が返ります。
  • SQLへのリクエストと結果が補完できるようになります。(echo $user['name']name`は入力補完されます。)
  • 連想配列の使い方に間違いないかpsalmやphpstanで静的解析出来ます。
  • 入力補完にはdeep-assoc-completionが必要です。
  • array shapek記法については https://phpstan.org/writing-php-code/phpdoc-types#array-shapes を参照してください。
  • Ray.QueryModuleはSQLをSQL実行オブジェクトに変換します。@Queryはメソッドインターセプトしてidで指定したSQLを実行してメソッドの結果として返します。
  • メソッドは入出力のシグネチャーだけ利用し中身はなしでもOKです。SQL実行の結果を更新したい場合にはSQL実行結果がセットされた$bodyを変更しreturn $this;します。(BEAR.Sundayの場合)
  • psalmを使っている場合には@psalm-suppressでエラー抑制するか(メソッド内に記述がないため)、ダミーのデータを返却する必要があります。
  • Ray.Di + Ray.QueryModuleをインストールすればBEAR.Sundayでなくても使えます。
<?php

class Users
{
    public function listNames(int $age) : void
    {
        $users = $this->getUsers($age);
        foreach ($users as $user) {
            echo $user['name'] . PHP_EOL;
        }
    }

    /**
     * @Query(id="users_by_age", type="row_list")
     *
     * @return array<array{id: string, name: string}>
     * @psalm-suppress InvalidReturnType
     */
    public function getUsers(int $age) : array
    {
        unset($age);
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment