I've got a partial solution—it does what I want (I
think), but takes several queries to do it. It's based
on the node I linked above. Here's what I have:
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);
=cut
--Brent Dax
There is no sig.