Transfer のリレーション設定の一つである manytomany って、なんとなく見過ごしてきたけど、実際のところ、これって何よ?というわけで、調べてみた。
多対多ということなんだろうけど、浅学なのか、こういうリレーションてのは、あまり考えたことがなかった。
例えば、ユーザーというデータがあって、そのユーザーが購入した商品は、複数ある。
逆に、ある商品を購入したユーザーは、複数人いるというのが、多対多ということらしいけど、どうやって設定するのやら。
以前、Transfer のサンプルの tBlog の Transfer.xml で manytomany を見かけたけことを思い出して、参考にしてみた。
インターネット上の情報から考えても、どうやら、リレーション用のテーブルを設けるらしい。
そんなわけで、テーブル設計。実際にはまったく使えないテーブル構成だ・・・。

ITEMMST と、USERMST のリレーション用テーブル USERMST_ITEMMST は、Transfer.xml では、オブジェクトとしては、設定しないようだ。
Transfer.xml は、以下のようになる。
<package name="master">
<!-- Item -->
<object name="Item" table="ITEMMST" sequence="ITEMMST_itemid_seq">
<id name="ItemId" type="numeric" column="itemid" generate="false" />
<property name="ItemName" type="string" column="itemname" />
<property name="Price" type="numeric" column="price" />
<manytomany name="ItemUserLink" table="USERMST_ITEMMST" lazy="true">
<link to="master.Item" column="lnkitemid" />
<link to="master.User" column="lnkuserid" />
<collection type="array">
<order property="UserId" />
</collection>
</manytomany>
</object>
<!-- User -->
<object name="User" table="USERMST" sequence="USERMST_userid_seq">
<id name="UserId" type="numeric" column="userid" generate="false" />
<property name="UserName" type="string" column="username" />
<manytomany name="UserItemLink" table="USERMST_ITEMMST" lazy="true">
<link to="master.User" column="lnkuserid" />
<link to="master.Item" column="lnkitemid" />
<collection type="array">
<order property="ItemId" />
</collection>
</manytomany>
</object>
</package>
とりあえず、データを登録するコードは、こんな感じ。
<cfscript>
var userObj = ""; var itemObj = "";
</cfscript>
<cfset userObj = variables.transfer.new("master.User") />
<cfset userObj.setUserId(1) />
<cfset userObj.setUserName("hoge") />
<!--- get item --->
<cfset itemObj = variables.transfer.get("master.Item", 1) />
<cfset userObj.addUserItemLink(itemObj) />
<!--- save --->
<cfset variables.transfer.save(userObj) />
cascade とかじゃなく、save だけで、リレーション用テーブルの USERMST_ITEMMST へもデータが登録できた。
で、ManyToMany って、いったい、どんなときに使えるのだろう?
ドキュメントの例では、ユーザーに許可された機能権限が挙げられていた。なるほどねぇ。