> There are a few possible ways to go about this.  One is the manual
 > way, where you actually instantiate and them modify the map record
 > separately, as shown here:

...

 > Finally, you could forego the many-to-many relationship definition and
 > instead (or "also") defined it as chain of relationships that
 > explicitly includes the mapping table:


Thanks for the quick and extremely thorough response. I ended up using a 
combination of these two  methods, depending on whether I was creating a 
new set of tags for a project, or just adding a single tag to an 
existing project.

Thanks again,


- jud


John Siracusa wrote:
> On 11/7/06, Jud Dagnall <[EMAIL PROTECTED]> wrote:
> 
>>In my application, there is are projects, tags, and profiles (users).
>>Projects can be tagged by multiple profiles. Each tag has a many-to-many
>>relationship both projects and profiles. There's a mapping table
>>(tag_project_profile_map) with a 3-column primary key that relates those
>>three tables.
>>[...]
>>I'd like to be able to add tags to a project as follows (specifying the
>>missing primary key value):
>>
>>$project->tags( { name = 'cool_stuff', profile_id => 1 } );
>>$project->save;
>>
>>However, this gives me an error because the 'tags' table doesn't
>>actually have a profile_id, only the mapping table does.
> 
> 
> There are a few possible ways to go about this.  One is the manual
> way, where you actually instantiate and them modify the map record
> separately, as shown here:
> 
> 
>>my $mapping = TagProjectProfileMap->new(
>>        {project_id => 1,
>>          tag_id => 2,
>>          profile_id => 3});
>>$mapping->save;
> 
> 
> (Although the argument to new() should not be a hashref.)
> 
> Another way is to set the tags, use the Manager to re-fetch them,
> modify the map records, and then re-save them:
> 
>     $project->new(id => 1)->load;
>     $project->tags(...);
>     $project->save;
> 
>     $project =
>       Project::Manager->get_prouducts(
>         with_objects => [ 'tags' ],
>         with_map_records => 1,
>         query => [ id => 1 ])->[0];
> 
>     foreach my $tag ($project->tags)
>     {
>       $tag->map_record->profile_id(...);
>       $tag->map_record->save;
>     }
> 
> That's a save(), load(), and then re-save() for each map record, however.
> 
> The next method I can think of is to split up your single mapping
> table into two mapping tables, e.g.. project_tag_map table and a
> project_profile_map.  Then you could just do:
> 
>     $project->tags(...);
>     $project->profiles(...);
>     $project->save;
> 
> Maybe that's not exactly in keeping with what you're trying to model,
> but the three-way tag_project_profile_map mapping table is a bit odd.
> The concept of a map table in RDBO is supposed to be part of a
> many-to-many relationship between two classes, not three.  As you've
> discovered, it'll pretty much still work with three, but there's a bit
> of a mismatch in intent.
> 
> Finally, you could forego the many-to-many relationship definition and
> instead (or "also") defined it as chain of relationships that
> explicitly includes the mapping table:
> 
>              Project
>                 |
>            one to many        <- rel name: tag_profile_map_records
>                 |
>                 v
>         TagProjectProfileMap
>           /            \
>      foreign key    foreign key
>         /                \
>        v                  v
>       Tag               Profile
> 
> Then do:
> 
>     $project->new(id => 1)->load;
> 
>     $project->tag_profile_map_records
>     (
>       {
>         tag     => { name => 'foo', ... },
>         profile => { username => 'bar', ... },
>       },
>       {
>         tag     => { name => 'baz', ... },
>         profile => { username => 'blee', ... },
>        },
>        ...
>     );
> 
>     $project->save;
> 
> 
>>I looked at trying define a custom primary_key_generator() function in
>>my TagProjectProfileMap, but I didn't see that I could get the
>>additional parameters.
> 
> 
> A pk generator is definitely not the right approach to this problem.
> 
> -John
> 
> -------------------------------------------------------------------------
> Using Tomcat but need to do more? Need to support web services, security?
> Get stuff done quickly with pre-integrated technology to make your job easier
> Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
> http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
> _______________________________________________
> Rose-db-object mailing list
> Rose-db-object@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/rose-db-object
> 
> 



-- 
Jud Dagnall
Technical Yahoo!                       Platform Engineering
[EMAIL PROTECTED]                 PH: +1 (408) 349-4478

Bugzilla questions?
http://twiki.corp.yahoo.com/view/Bugzilla/BugzillaFAQ


-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
Rose-db-object mailing list
Rose-db-object@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rose-db-object

Reply via email to