外部キーと複合キー (3) 親子孫の関係で参照連動を行う

最終更新日: 2022年7月4日

設定方法

前ページで説明したサンプルでは、孫モデルCに含まれる子モデルBの主キーは「値」のみとなっていたため、画面上で何を意味しているのかがわかりにくいものとなっていました。

これを改良し、主キーの値ではなく(モデルの)名前部分を表示できるようにします。そのために新たに次の項目を追加します。

項目名 項目ID DB保存 その他
モデルAの名前 MODELA_NAME モデル参照(検索) なし スクリプトを使って、この値を MODELA_PKEY_MODELB 項目に転記します。
モデルBの名前 MODELB_NAME モデル参照(検索) スクリプトを使って、この値を MODELB_PKEY 項目に転記します。
モデルAのメモ MODELA_MEMO 参照連動 連動元項目は MODELA_NAME です。
モデルBのメモ MODELB_MEMO 参照連動 連動元項目は MODELB_NAME です。
追加した4項目
MODELA_NAME項目の設定 (検索画面)
MODELB_NAME項目の設定 (検索画面)
MODELA_MEMO項目の設定 (参照連動)
MODELB_MEMO項目の設定 (参照連動)

追加した項目 MODELA_NAME と MODELB_NAME は登録画面と更新画面で読み込み専用とします。

MODELA_NAME項目を読み込み専用とする
MODELB_NAME項目を読み込み専用とする

さらに、これらの項目はすべてデータベースに保存しない、とします。(参照連動項目は標準でデータベースに保存しない、となっているため、設定の図を割愛しています。)

MODELA_NAME項目をデータベースに保存しない
MODELB_NAME項目をデータベースに保存しない

登録(初期データ作成)スクリプト

MODELA_NAME 項目は、モデルAのNAME項目と紐づけています。実体はモデルAの主キー値が格納されます。そこで、この項目には MODELA_PKEY_MODELB 項目の値(=モデルAの主キー)をセットします。これによってモデル参照(検索)項目に値が自動セットされます。

MODELC.MODELANAME = MODELC.MODELAPKEYMODELB;

同様に MODELB_NAME 項目に、モデルBの主キー値を紐付けます。ところが MODELB_BAME 項目はモデルBの参照ですので、定義上の項目は1つですが、実体は MODELB_NAME_MODELA_PKEY と MODELB_NAME_MODELA_PKEY の2つの項目が用意されています。これにそれぞれ値をセットする必要があります。

生成される列の命名規則は次のとおりです。

(Wagbyの)項目名_参照先モデルの主キー項目名

MODELC.MODELBNAMEMODELAPKEY = MODELC.MODELAPKEYMODELB;
MODELC.MODELBNAMEMODELBPKEY = MODELC.MODELBPKEY;

モデル参照項目に値を格納したあと、さらに参照連動処理を行うことで MODELA_MEMO と MODELB_MEMO 項目に適切な値をセットすることができます。

helper = p.appctx.getBean("MODELCHelper");
helper.resolvRelatedItem(MODELC, p);

ここまでの処理を、MODELA_PKEY_MODELB 項目に値が格納されていれば(0より大きな値があれば)行う、と if 文で括ります。

登録(初期データ作成)スクリプト
if (MODELC.MODELAPKEYMODELB > 0) {
    // モデルBから新規登録またはモデルCのコピー登録を行った場合
    MODELC.MODELANAME = MODELC.MODELAPKEYMODELB;
    MODELC.MODELBNAMEMODELAPKEY = MODELC.MODELAPKEYMODELB;
    MODELC.MODELBNAMEMODELBPKEY = MODELC.MODELBPKEY;
    helper = p.appctx.getBean("MODELCHelper");
    helper.resolvRelatedItem(MODELC, p);
}

キャメル記法

スクリプトでは項目IDの表記にキャメル記法ルールが適用されます。アンダースコア "_" は除かれ、次の文字が大文字になります。(上の例はすべて大文字で項目IDを用意したため、アンダースコアの文字を除いただけになっています。)

詳しくは「スクリプト > ヘルパとコントローラ > キャメル記法」をお読みください。

参照連動との組み合わせ

スクリプトで値を設定したあと、この項目が「連動元」となって参照連動を解決する必要がある場合、ヘルパクラスの resolvRelatedItem メソッドを呼び出してください。

詳しくは「スクリプト > サンプルコード > 参照連動処理を呼び出す」をお読みください。

詳細画面表示スクリプト

追加した4項目はすべてデータベース保存なし、としています。そこで詳細画面表示時にも同じ処理を適用します。

詳細画面表示時も同じスクリプトを適用する
MODELC.MODELANAME = MODELC.MODELAPKEYMODELB;
MODELC.MODELBNAMEMODELAPKEY = MODELC.MODELAPKEYMODELB;
MODELC.MODELBNAMEMODELBPKEY = MODELC.MODELBPKEY;
helper = p.appctx.getBean("MODELCHelper");
helper.resolvRelatedItem(MODELC, p);

動作例

モデルCの新規登録画面を開きます。赤枠で囲った4つの項目が表示されています。

スクリプトと参照連動により値が表示されている

入力項目に値をセットし、保存します。

モデルCを登録する

詳細画面表示時もスクリプトが動作し、値が表示されます。

モデルCの詳細画面