Salesforceで多対多のコネクションを張るには
なんで俺は今までこれを知らなかったのかと後悔したやり方なので、Salesforceの管理者を担う人はぜひ覚えておいてほしい。
通常Salesforceでは、あるオブジェクトにぶら下げた子オブジェクトを配置するということをよくやる。例示すると、例えば毎週週報を書くとすると
Userオブジェクト:自分のレコード
┗週報オブジェクト
という形で、週報オブジェクト側から主従関係で自分のレコードに紐付けるみたいな形にします。これは簡単、よくやる。
多対多のコネクションとは
上述のやり方だと、作るレコードから見て主となるレコードは一つのみである。Salesforceでは、主レコードを複数持つような構造は許されていない。そのために、こういう構造は作れないのだ。
例えば、イベントのチケットを取得する事を考えよう。チケットAは50枚上限だとする。Userオブジェクトにこれまでに取得したチケットをぶら下げたい。一方で、チケットAを取得した人のリストをチケットオブジェクト側にぶら下げたい。みたいなものだ。
Userオブジェクト:ユーザーA
┣チケットA
┣チケットB
┗チケットC
Userオブジェクト:ユーザーB
┣チケットA
┗チケットC
チケットオブジェクト:チケットA
┣ユーザーA
┗ユーザーB
チケットオブジェクト:チケットB
┗ユーザーA
チケットオブジェクト:チケットC
┣ユーザーA
┗ユーザーB
チケットオブジェクト側で主従関係を設定してユーザと紐づけてしまうとこういう設定はできない。で、どうするかというとこうなる。
多対多リレーションの作成
要は、多対多リレーションを作成したいオブジェクトの中間に、ダミーのオブジェクトを配置せよという事だ。
ユーザー←接続用オブジェクト→チケット
という形で主従関係で双方をつなぐのである。
運用としては、まずチケットオブジェクトにチケットA,B,Cを登録する。
次に、ユーザオブジェクトからダミーオブジェクトのレコードを作成し、チケットを選択して保存する。
チケット側には関連リストとしてユーザリストを表示するようにできるし、逆にユーザ側には取得したチケットリストを表示することができるようになる。ついでにいうと、中間オブジェクトにチケットの有効無効といったステータスや、支払い済みフラグみたいなものを設ける事もできる。実体となるような対象は接続先の終端のオブジェクトとして作り、そのステータス情報みたいなものを中間オブジェクト側にもつような形にする。
何だよまじかよこんな形で実現するんかーいと肩を落としたのが僕でしたとさ。めたくそ便利なのでぜひ頭の片隅に入れておいてくれると良いと思います。