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.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.