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