[Dbix-class] Chaining multiple many-to-many relations
Jean-François Stenuit
jfs at chryseis.be
Wed Dec 15 16:19:50 GMT 2010
Hi Jon,
Thanks for the answer.
That's what I suspected. However, this approach is not optimal in
terms of queries : I actually get one query per group like this :
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '3' )
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '5' )
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '6' )
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '7' )
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '10' )
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '11' )
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '12' )
SELECT bapplication.id, bapplication.site_id, bapplication.code,
bapplication.comment FROM bgroup_2_application me JOIN bapplication
bapplication ON bapplication.id = me.application_id WHERE (
me.group_id = '16' )
where a single query of this form should do the trick :
select bapplication.* from bapplication
join bgroup_2_application on
bapplication.id=bgroup_2_application.application_id
join bgroup on bgroup_2_application.group_id=bgroup.id
join buser_2_group on bgroup.id=buser_2_group.group_id
join buser on buser_2_group.user_id=buser.id
where buser.id=8;
Will keep on investigating.
-- Jean-François "Jef" Stenuit
On Wed, Dec 15, 2010 at 4:37 PM, Jon <jon at texttoall.com> wrote:
>> I'd like to use a shortcut of the form :
>> my $rsApplications=$rowUser->groups->applications
>>
>> But it does not seem to work. I get this error : Can't locate object
>> method "applications" via package "DBIx::Class::ResultSet"
>
> The result of $rowUser->groups is a DBIx::Class::ResultSet...so it's a
> collection of your "groups", not an actual "group". You can only call
> ResultSet methods on it like, next, and count. If you want to get to
> your actual group object, which is where you can then call
> "applications", you need to address the actual result object. e.g.
> my $groups = $rowUser->groups;
> while ( my $group = $groups->next ) {
> my $applications = $group->applications;
> while ( my $app = $applications->next ) {
> # doing awesome app stuff
> }
> }
>
> Hope that helps.
>
> - jon
>
More information about the DBIx-Class
mailing list