Yeah, don't do that with m2m Use an interim table with composite keys.
Mark On Sat, Sep 26, 2009 at 2:27 PM, whostheJBoss <[email protected]>wrote: > > Oops, just a typo from removing something. In the actual code they ARE > using the same table. It's actually called taglinks > > On Sep 25, 9:02 pm, Mark Mandel <[email protected]> wrote: > > In your example they are using different tables, one is using > posttags,and > > one is using commenttags. > > > > I can't guarentee what will happen if you mix n' match m2m relationships > on > > a single table. Transfer assumes a m2m is a table with 2 foreign keys on > > it, no more, no less. > > > > If you want to go down this route, i would suggest an interim object with > > composite ids. > > > > Mark > > > > On Sat, Sep 26, 2009 at 1:50 PM, whostheJBoss < > [email protected]>wrote: > > > > > > > > > > > > > > > > > :) Perhaps your brain will see the answer to this one instantly (or > > > you've got a standard solution for this circumstance). Mine doesn't > > > want to see it, I guess. > > > > > I am using ColdBox and Transfer and am experiencing some behavior I > > > can't wrap my head around. (It's most likely an error in my logic) > > > > > I have a Transfer object defined called posts.post which has a many to > > > many of tags.tag: > > > > > <package name="posts"> > > > <object name="post" table="posts"> > > > <id name="postID" type="numeric" /> > > > <property name="postTitle" type="string" > column="postTitle" > > > nullable="false" /> > > > > > <manytomany name="tags" table="posttags" proxied="true" > > > lazy="true"> > > > <post to="posts.post" column="postID"/> > > > <post to="tags.tag" column="tagID"/> > > > <collection type="array"> > > > </collection> > > > </manytomany> > > > > > </object> > > > </package> > > > > > <package name="tags"> > > > <object name="tag" table="tags" > > > decorator="components.decorators.tags"> > > > <id name="tagID" type="numeric" /> > > > <property name="tagTitle" type="string" > column="tagTitle" > > > nullable="false" /> > > > </object> > > > </package> > > > > > I also have a Transfer object called comments.comment which also needs > > > a many to many of the tags.tag object > > > > > Basically, I have posts and comments, both of which have tags. I want > > > them to share the same tags table. > > > > > In my posttags (the link table) table I have: > > > > > postTagID > > > tagID > > > postID > > > commentID > > > > > So, before I add the comments.comment object to the mix, everything is > > > fine. I can add tags to my posts.post objects and they are saved in > > > the database as they should be when I used Transver.save(), everything > > > works great. The commentID field in the posttags table isn't used at > > > this point. > > > > > So, if I add: > > > > > <package name="comments"> > > > <object name="comment" table="comments"> > > > <id name="commentID" type="numeric" /> > > > <property name="commentTitle" type="string" > > > column="commentTitle" > > > nullable="false" /> > > > > > <manytomany name="tags" table="commenttags" > proxied="true" > > > lazy="true"> > > > <comment to="comments.comment" > column="commentID"/> > > > <comment to="tags.tag" column="tagID"/> > > > <collection type="array"> > > > </collection> > > > </manytomany> > > > > > </object> > > > </package> > > > > > This also gives the comments.comment objects a many to many with > > > tags.tag on commentID (instead of postID) > > > > > So, when viewing these objects on a page, it works fine. I can do: > > > > > instance.Transfer.get("comments.comment", 1) and dump the object's > > > getTagsArray() and see all of the associated tags. > > > > > I can do: > > > > > instance.Transfer.get("posts.post", 1) and dump the object's > > > getTagsArray() and see all of the associated tags. > > > > > Both objects work fine for retrieving data. > > > > > So, if I do: > > > > > // get a post > > > myPost = instance.Transfer.get("posts.post", 1); > > > > > // get two tags > > > tag1 = instance.Transfer.get("tags.tag", 1); > > > tag2 = instance.Transfer.get("tags.tag", 2); > > > > > // add the tags to the post > > > myPost.addTags(tag1); > > > myPost.addTags(tag2); > > > > > I am just adding two tags to post with ID 1. > > > > > If I dump myPost.getTagsArray() I see both tags appear properly in the > > > array, however, if I add: > > > > > instance.Transfer.save(myPost); after the two addTags() lines to save > > > the myPost object and then dump mypost.getTagsArray(), after the save, > > > the tags are gone. They do not save and do not show up in the database > > > in the posttags table. > > > > > When I check the SQL output, no inserts have been run. > > > > > Somehow, saving the object drops the many to many relationships it had > > > right before save. > > > > > If I remove the many to many on the comments.comment object, the > > > posts.post save begins to work and save the tags and inserts them into > > > the database. So, having two objects with the same many to many, even > > > on different fields, causes erratic behavior. > > > > > Obviously I can addTags() fine, they show up in the object, they just > > > won't save whenever another object also has a many to many with the > > > same object I'm trying to save. > > > > > As a workaround, I created a second tag object: > > > > > <object name="ctag" table="tags" > > > decorator="components.decorators.tags"> > > > <id name="tagID" type="numeric" /> > > > <property name="tagTitle" type="string" > column="tagTitle" > > > nullable="false" /> > > > </object> > > > > > Then told the many to many on comments.comment to use that object > > > instead: > > > > > <manytomany name="tags" table="commenttags" proxied="true" > > > lazy="true"> > > > <comment to="comments.comment" column="commentID"/> > > > <comment to="tags.ctag" column="tagID"/> > > > <collection type="array"> > > > </collection> > > > </manytomany> > > > > > Doing this allows me to add tags to both posts.post objects and > > > comments.comment object without problems, but it feels like a cheap > > > way of doing this since I'm using two different tag objects which > > > represent the same data. > > > > > (One other odd note... If I reinitialize my ColdBox application on the > > > page that adds tags to and save the posts.post object before calling > > > any others, it begins to work. After that, I can add all the tags I > > > want to posts.post and they get saved, even when the comments.comment > > > many to many for tags.tag also exists. Although, sometimes this only > > > works the first time I hit the page. However, if I reinitialize my > > > application on any other page BUT the one that adds and saves tags, > > > then when I do try to call that page, the tags aren't saved to the > > > database. They show up on the object after they've been added, but > > > once I do Transfer.save() on the object, they are no longer there.) > > > > > Perhaps this is some funky cache / object recreation issue, but I'm > > > not sure at all at this point. I thought maybe whichever object uses > > > the many to many relationship first (comments.comment or posts.post) > > > would be the only one that could save the tags, but I'm not sure. I > > > can still add tags to either one and they show up in the array, but > > > once I save... poof, they are gone. > > > > > I'm just looking for the "right" way to set this up, where two objects > > > need to both have a many to many on the same object. > > > > > Like I said, right now I can just use a second tag object definition > > > on a different column and that seems to resolve things, it just > > > doesn't "feel" right. Especially if I update the tag's data, then both > > > tags.tag and tags.ctag would have to be updated, and, well, that's > > > getting into tricky territory. > > > > > ANY suggestions would help, really just looking for the right way to > > > structure this. I should be able to deduce the basic logic from > > > someone saying "Oh, you just need to have many to many on [insert the > > > answer I need here] instead" =) > > > > -- > > E: [email protected] > > T:http://www.twitter.com/neurotic > > W:www.compoundtheory.com > > > -- E: [email protected] T: http://www.twitter.com/neurotic W: www.compoundtheory.com --~--~---------~--~----~------------~-------~--~----~ Before posting questions to the group please read: http://groups.google.com/group/transfer-dev/web/how-to-ask-support-questions-on-transfer You received this message because you are subscribed to the Google Groups "transfer-dev" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/transfer-dev?hl=en -~----------~----~----~----~------~----~------~--~---
