🌊

備忘録06 Flutter firebase 参照方法 条件編

2024/07/02に公開

概要

実務でsqlserverを使ったデータベースの操作をしているが、
flutterのfirebaseへの操作方法とのギャップがすごく、大変だったので
ここに残す

SQLServerとFirebaseとの違い

ちょっと硬めに言うと、
SQLServer はリレーショナルデータベース管理システム(RDBMS)であり、データはテーブルの形式で保存され、SQL(Structured Query Language)を使用してデータの管理やクエリを行う。

Firebase はNoSQLデータベースであり、データはドキュメントやコレクションの形式で保存される。階層構造(ツリー構造)を持ち、リアルタイムデータベースやクラウドファイアストアとして、スキーマレスなデータモデルを提供している。

この構造が違うために、とても苦労した。

例えば、SQLServerではテーブルの結合をすることで参照する方法が楽だったが、
それができないため、すごく処理がめんどくさい...
慣れてないだけかもだけど。
あと、OR句が使えないのもきつかった...

Firebaseの条件

以下のサイトと参照して勉強した。めっちゃ助かった。
https://zenn.dev/flutteruniv_dev/articles/a5e6c9f71e6ea4

この中で直接操作できるものとできないものを記載する。

検索する時

過去に社員検索機能を実装した時、以下の条件で検索できるようにしていた。
・ワード検索(入力した文字列が含まれる社員を検索)
・部署を指定
・並び替え(登録日の昇順/降順)

それぞれこんな感じで設定

  Future<List<String>> fetchSearchUsers(
      String keyWord, String department, String orderById) async {
    // コレクション指定
    Query query = FirebaseFirestore.instance.collection('users');

    // 部署を指定している場合、条件追加
    if (department != '') {
      query = query.where('department', isEqualTo: department);
    }

    // 昇順/降順が指定している場合、条件追加(降順がデフォルト)
    if (orderById == "up") {
      query = query.orderBy('createDate', descending: false);
    } else {
      query = query.orderBy('createDate', descending: true);
    }

    // 条件を絞ったデータの取得
    QuerySnapshot querySnapshot = await query.get();

    List<String> userNameList = [];
    for (var document in querySnapshot.docs) {
    // keyWordが空もしくは'userName'にkeyWordが含まれている場合、listに格納
      if (keyWord == "" || document['userName'].contains(keyWord)) {
        userNameList.add(document['userName']); // 'userName' の値を抽出
      }
    }

    return userNameList;
  }

最後に

このやり方で何とかいけているが、性能があまり良くない...
これをどうにか打破しなくては。

Discussion