🧩

Severpodで中間tableを作る

2023/04/06に公開

Serverpod 1.0.1を使う 3

前回、ぶじ取得したLastValを使って、二つのtableを繋ぐ中間tableを作成する。

大きな声で呼んだからといって、答えてくれるわけではない

基礎学力がないまま、いきなり過去問で学習する、ような性格。
なので、変数の可動領域? のようなことがわかっていない。
前回は、「どこで呼べばclientは答えてくれるか」というところがネックだったが、
今回も同様に、こっちで呼んでる値は、ほんとに受け渡されてるか問題、で停滞した。

爺様の学習期間は21年9月まで?

ということは、serverpodはまだないか、固まっていないか、いずれにせよ、serverやendpointについて質問すると、一見それらしいけどけっこう奇天烈な回答が出てくるということに気づく。
愛ちゃんはといえば、1000字までしか読んでくれないので、code全体を貼り付けると怒られる。

やろうとしたこと

前回、あるdataをtableAに登録したら、そのIDが取れる、ところまでできた。
今回は、さらにtableBに別情報を登録して、そのIDを取り、
二つのIDを中間tableに入力しよう、という計画。

まずendpointで関数を設定。generateして、あっちこっちできるに任せる。
前提として、DBには、principal, date, principalDateという三つのtableがある。

newpod_server/lib/src/endpoints/add_event_endpoint.dart
import 'package:newpod_server/src/generated/protocol.dart';
import 'package:serverpod/serverpod.dart';

class AddEventEndpoint extends Endpoint {
  //principal
  Future<int> addPrincipal(Session session, Principal principal) async {
    await Principal.insert(session, historical);
    var principalLastVal = await session.db.query('SELECT LASTVAL()');
    return principalLastVal[0][0] as int;
  }

  //date
  Future<int> addDate(Session session, Date date) async {
    await Date.insert(session, date);
    var dateLastVal = await session.db.query('SELECT LASTVAL()');
    return dateLastVal[0][0] as int;
  }

  Future<bool> addPrincipalDate(
    Session session, PrincipalDate principalDate) async {
    await PrincipalDate.insert(session, principalDate);
    return true;
  }
}

次はflutter側、単純なstatefulwidgetです。
長くなるので、UIについては説明のみにします。

  • principalに入力する情報を書き込むTextFormField
  • addPrincipal()を呼ぶボタン。
  • dateに入力する情報を書き込むTextFormField、
  • addDate()を呼ぶボタン。
  • addPrincipalDate()を呼ぶボタン、です。

うまくいかなかったcode。

newpod_flutter/lib/addEventPage.dart
class AddEventPageState extends State<AddEventPage> {

  var year = 0.0;
  var event = "";
  var country = "";
  var date = "";
  var principalLastVal = 0;
  var dateLastVal = 0;

  addPrincipal() async {
    var principal = Principal(year: year, event: event, country: country);
    principalLastVal = await client.addEvent.addPrincipal(principal);
    print(principalLastVal);
    debugPrint("add principal");
  }

  addDate() async {
    var date = Date(date: date);
    dateLastVal = await client.addEvent.addJour(jour);
    print(dateLastVal);
    debugPrint("add date");
  }

  addPrincipalJour() async {
    var principalDate =
        PrincipalDate(principalId: principalLastVal, dateId: dateLastVal);
    await client.addAffair.addPrincipalDate(principalDate);
    debugPrint("add principalDate");
  }

これを見て、速攻で何が悪いかわかる方は、この記事は読まなくていいです笑。
もちろん、flutterとして何が悪いかはわかるけど、serverpodの使い方は知りたい、
という方はお役立てください。

うまくいかなかったことと対処

clientから二つのLastValが呼ばれていることは、consoleを見ればわかる。
(ちなみに、このprintは嫌われますが、私は好きです、最初に習ったことって愛着がある)
呼ばれているけれども、中間tableに入力する関数には渡っていない。
結果、中間tableには初期値0が入る。
同じPageにあるのにねえ、関数の中から出てこないのかい。引きこもり君。

ということで、改善策。

newpod_flutter/lib/addEventPage.dart
class AddEventPageState extends State<AddEventPage> {

 late int principalLastVal; //ここと
  late int dateLastVal;   //ここ

  var year = 0.0;
  var event = "";
  var country = "";
  var date = "";

ほんのわずかな違いなのに、決定的に違うのね

Flutter大学

Discussion