🧩

Serverpod  orderByの実装

2023/03/21に公開

Serverpod 1.0.0覚え書き 8

orderByの実装

そんな大げさなタイトルを付けるほどのことだろうか? MySQLではいつもやっていたことだ。けれどもServerpodだとよくわからない。つまり、単純にいつものSQL文を書くのではないから、どこにどうやって書くんだ、という話になる。

その前に、yearをintに戻す

orderByで使う数字をtextからintegerに戻さなければならない。戻したらまたあの謎errorに遭遇するかもしれないけれども、直さないことには始まらない。

  • newpod_server/lib/src/protocol/principal_classで該当columnをintに戻す。
  • serverpod generate
  • newpod_flutter側で赤が出るので対処

まず入力側、onChangeを修正

                child: Format(
                    hintText: 'year',
                    onChanged: (value) {
                      year = int.parse(value); 
                    })

それから出力側、intで取得したyearをListTileにTextとして表示するように変更

              child: ListTile(
                leading: Text(_principal[index].year.toString()), //ここ
                title: Text(_principal[index].event),
                subtitle: Text(_principal[index].country),
                ),

実はここはWarp AIに教えてもらった。

でもエラーが出る

なんとPostgreSQL側の設定が変わっていない。最初の設定はserverpodからするのに、直すのはダメなんかい。ということで結局、Posticoでqueryを打って変更。

  • ALTER TABLE historical ALTER COLUMN year TYPE integer USING year::integer;

やっぱりSequelAceのほうが簡単だったな。まあ、仕方がない。できたんだからいいじゃないか。

よっしゃ、これで入力も出力もできました。

そしてorderBy

これがまた、情報が全然ない。試しにWarp愛ちゃんに聞いてみたら、もっともらしいコードが返ってきたので書いてみたが、真っ赤になるばかり。で、いろいろ検索したら、唯一見つかったのはGitHubのissue、けっきょく青い鳥はお家にいたのでした。

できあがったコードがこちら

newpod_server/lib/src/endpoints/newpod_endpoint.dart
  Future<List<Principal>> getPrincipal(Session session,
      {String? keyword}) async {
    return await Principal.find(
      session,
      where: (t) =>
          keyword != null ? t.affair.like('%$keyword%') : Constant(true),
      orderBy: Principal.t.year,
    );
  }

Flutter側からはただgetPrincipal()を呼ぶだけで、ちゃんと並んだデータが出力される。

さあ、次はなにをやろうかな

Flutter大学

Discussion