my $attrs = { order_by => "$order DESC", page => $page, rows => $rows, columns => [ qw(title title_norm description created modified status rating owner.nickname owner.nick_norm ) ], join => [ qw(owner) ], }; my $articles = $c->model('DBIC::Articles'); # Build the query. if($owner) { $articles = $articles->search({ owner => $owner }); } if(@with) { $articles = $articles->search_related('taglinks', { tag => { -in => [ @with ] } }, { select => [ 'article', { count => '*' } ], group_by => [ 'article' ], having => [ 'COUNT( * )' => scalar(@with) ] } )->search_related('article'); } if(@without) { my $excluded = $articles->search_related('taglinks', { tag => { -in => [ @without ] }, }, { columns => [ 'article' ], group_by => [ 'article' ] } ); if($excluded) { my @excluded_ids = map { $_->id } $excluded->all; $articles = $articles->search( { id => { -not_in => \@excluded_ids } } ); } } $articles = $articles->search(undef, $attrs);