3

我正在使用DBIx::Class来检索结果,如下所示:

my $users = $c->model('DB::User')->search(
    { active_yn => 'y', client_yn => 'n' },
    {   
        columns => [qw/id first_name last_name username email/],
        order_by => ['last_name'],
        page     => ($c->req->param('page') || 1), 
        rows     => 20, 
    }   
); 

但是,一旦我得到结果,我想知道返回了多少,但我似乎找不到提供的方法来告诉我这一点。有谁知道$users执行此查询后如何获取计数?谢谢!

4

1 回答 1

11

你可以做:

my $num_users = $users->count;

该对象也被数值重载以返回计数:

my $num_users = $users + 0;

如需参考,请参阅https://metacpan.org/module/DBIx::Class::ResultSet#count

更新:关于为什么结果集需要发出单独的查询来获取计数。

注意结果集类的主要描述:

ResultSet 是一个对象,它存储一组表示查询的条件。它是 DBIx::Class 的支柱(即真正重要/有用的部分)。

创建 ResultSet 时不会在数据库上执行任何 SQL,它只存储创建查询所需的所有条件。

...

ResultSet 表示的查询仅在调用以下方法时对数据库执行:“find”、“next”、“all”、“first”、“single”、“count”。

换句话说,结果集在查询之前没有计数。

当您使用它遍历结果集next时,它将保留它从数据库中读取的记录的存储,但它会在将这些记录提供给您时丢弃这些记录,这意味着它无法从已读取的内容中为您提供计数. 如果你想这样做,你需要要求它们被缓存。

my $resultset = $schema->resultset('Artist')->search( undef, { cache => 1 } );
my @records = $resultset->all;
my $count = $resultset->count; # this uses the count of the cached records
于 2013-06-06T01:52:40.503 回答