[Dbix-class] Query translation

Frank Schwach fs5 at sanger.ac.uk
Thu May 10 16:39:48 GMT 2012


Hi Kenneth,

this has nothing to do with Catalyst but it is a tricky one that stumped 
me too. To get the count out of your subquery and let DBIC take care of 
properly aliasing everything, try method

'as_subselect_rs'
(CPAN seems to be down at the moment but it is in DBIx::Class::ResultSet)

In brief, you do something like this:

my $final_rs = my $schema->resultset('whatever')->search( 
$inner_query_where_condition, 
$inner_query_options)->as_subselect_rs->search($outer_query_conditions, 
$outer_query_opts);

In your case the outer query conditions would be undef but you could use 
that to only retrieve records with a minimum count.

takes some playing around with and I'm afraid I don't have much time 
right now but do give it a go and feel free to ask if it isn't working 
for you - solved my problem for sure (very similar query).

Frank


On 10/05/12 16:55, Kenneth S Mclane wrote:
> I am trying to port this query to Catalyst:
>
> SELECT
>              s.server_id,
>              a.account_code,
>              s.server_name,
>              s.server_type,
>              s.os_name,
>              (select count(*) from server ss, subsystem sb
>                     where ss.server_id = sb.server_id
>                     and ss.server_id = s.server_id) as num_subsystems
>             FROM
>              account a,
>              server s
>             WHERE a.account_id = s.account_id
>             order by a.account_code, s.server_name
>
> This is what I have so far:
>
> sub list :Local {
>         my ($self, $c, $page) = @_;
>         $page = $c->req->param('page') || 1;
>         my $rs = $c->model('ORANGES::Server')->search_rs(undef, {
>                 prefetch => ['account','subs'],
>                 rows => 15,
>                 page => $page,
>                 '+select' => [{count => 'subs.subsystem.id'}],
>                 '+as' => [qw/num_subs/],
>                 order_by => ['account.account_code', 'server_name'],
>          });
>         $c->stash(rows => $rs);
>         $c->stash(pager => $rs->pager());
>         $c->stash->{'template'}=>'server/list';
> }
>
> I haven't figured out the count statement as yet. I am currently 
> getting my "as" added to the sql twice, i.e. "AS num_subs AS num_subs".
>
> I can only find examples counting one field, let alone 2 tables and 
> since I can't get it to return any results I can't even tell if it is 
> counting correctly.
>
>
>
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.scsys.co.uk


-- 
 The Wellcome Trust Sanger Institute is operated by Genome Research 
 Limited, a charity registered in England with number 1021457 and a 
 company registered in England with number 2742969, whose registered 
 office is 215 Euston Road, London, NW1 2BE. 



More information about the DBIx-Class mailing list