:) 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" =)
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---