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
-~----------~----~----~----~------~----~------~--~---

Reply via email to