DBIx :: Class:ResultSet获取大小

src*_*ulo 3 size perl count dbix-class

我正在使用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, 
    }   
); 
Run Code Online (Sandbox Code Playgroud)

但是,一旦我得到结果,我想知道已经返回了多少,但我似乎无法找到一个告诉我的方法.有谁知道如何$users在执行此查询后得到计数?谢谢!

ste*_*enl 11

你可以做:

my $num_users = $users->count;
Run Code Online (Sandbox Code Playgroud)

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

my $num_users = $users + 0;
Run Code Online (Sandbox Code Playgroud)

有关参考,请参阅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
Run Code Online (Sandbox Code Playgroud)