🧩
Serverpod orderByの実装
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()を呼ぶだけで、ちゃんと並んだデータが出力される。
Discussion