先日、検索画面から動的にクエリを構成したいんだけど、Aggregate だと検索条件が決め打ちになるので、検索条件が設定されていたら検索条件に加える、ということができないと相談をうけることがありました。
スキャッフォールディングで作成すると、自動的にこの対応がなされるのですが、複数の検索条件を想定して一から検索画面を作る際に思いつかなかったりと、意外に盲点になっている方がいらっしゃるのかなと思い、今回記事にしてみました。
#パラメータは Aggregate のなかで評価できる
単純な入力有無チェックを行う場合は、次のようなフィルタを追加することで、AdvancedSQL にすることなく、実現できます。
<入力パラメータ> = "" or <入力パラメータ> = Entity.Field
パラメータチェックは、最初(左側)にします。これで、入力があったら、検索条件に加えるという動作になります。
例えば、アカウントテーブルを定義して、名前、タイプ、開設日のフィールドを定義したとします。アカウント検索画面を作成して、入力されていたら条件に加える、という標準的な仕様があったとします。その場合は、このような感じになります。
SearchXXXというのは、各検索入力値です。
#入力有無以外のロジックは埋め込めるか
式を評価できる仕様にはなっていますが、シンプルな入力有無チェック以外の要件は、なかなかフィルタの中に記述しきれないと思います。
その場合は、Aggregate を呼び出す前に、呼び出し元で要・不要判定だけしておいて、Aggregate では、
<要・不要判定結果フラグパラメータ> and <入力パラメータ> = Entity.Field
のようにすることもできます。こちらは、もちろん and です。
パラメータではなく、関数に差し替えることもできますが、複雑な処理であれば、パラメータを使って外で計算するほうが、トラブルシューティングしやすいでしょう。