[Dbix-class] Multiple joins, noob questions

Robert Kinyon rob.kinyon at gmail.com
Mon May 16 13:07:25 GMT 2011


On Sun, May 15, 2011 at 19:51, Bill Moseley <moseley at hank.org> wrote:
> On Sun, May 15, 2011 at 2:23 PM, Robert Kinyon <rob.kinyon at gmail.com> wrote:
>>
>> >
>> > First, I make
>> > my $user = $schema->resultset('User')->find(1);
>> > Now I can get all user roles trought user object, but what can I do to
>> > get this roles, ordered by role_rank?
>>
>> my @ordered_roles = map { $_->role } $user->user_roles( {}, { order_by
>> => 'role_rank' } );
>
> role_rank is on the role (or roles, as the table is named), not the
> user_role.

Ok. Easily fixed.

my @ordered_roles =
$user->search_related('user_roles')->search_related( 'roles', {}, {
order_by => 'role_rank' } );

> BTW  -- be careful doing things like that.  Probably minor in this case, but
> might as well do that in a single query.  I tracked down a slow page the
> other day and it turned out looping and and generating over a thousand
> separate queries.  It's one of the reasons we must run database slaves.
>  Avoid the looping.

This is what prefetch is for. My original, if perfectly optimized,
could have been:

my @ordered_roles = map { $_->role } $user->user_roles( {}, { order_by
=> 'role_rank', prefetch => 'role' } );

Then, there's only one query.

Rob



More information about the DBIx-Class mailing list