Perl 我应该从DBIx::Class::ResultSet::*方法返回什么结果?

Perl 我应该从DBIx::Class::ResultSet::*方法返回什么结果?,perl,dbix-class,Perl,Dbix Class,我有下一个代码: #find contact with given email and/or phone sub contact { my( $self, $email, $phone ) = @_; my $user = $self; $user = $user->search({ email => $email }) if $email; $user = $user->search({ phone => $phone })

我有下一个代码:

#find contact with given email and/or phone
sub contact {
    my( $self, $email, $phone ) =  @_;

    my $user =  $self;
    $user =  $user->search({ email => $email })   if $email;
    $user =  $user->search({ phone => $phone })   if $phone;

    return $user->first; # I think this is wrong
}

在我的
ArtCoin::Schema::ResultSet::User
包中返回
Result

构建自定义结果集时,通常会返回新的结果集对象。在示例中,包含隐式
返回

因为没有返回,所以它只返回最后一条语句的返回值。这就是
$self->search(…)
部分

因此,您的代码如下所示:

sub contact {
    my( $self, $email, $phone ) =  @_;

    my $user =  $self;
    $user =  $user->search({ email => $email })   if $email;
    $user =  $user->search({ phone => $phone })   if $phone;

    return $user;
}
请记住,结果集实际上不是一个结果。此时还没有查询。如果在方法中首先调用
->
,它将与数据库对话并运行查询。之后,您不能将其他
search
es链接到ResultSet,因为您已经没有ResultSet了


下面的部分是代码回顾

你在那里做的很好,但有点复杂。您将链接到另外两个搜索,这将转换为DBIC需要在后台为您做的更多事情。想想这个方法应该如何运作

现在,它是这样做的:

  • 如果没有参数
    $rs->contact()
    ,它将返回与以前相同的结果集,而无需任何新的搜索条件(
    SELECT*FROM contacts
  • 如果存在电子邮件参数
    $rs->contact($email)
    ,它将返回一个新的结果集,其中包含电子邮件的附加搜索条件(
    SELECT*FROM contacts WHERE email='…'
  • 如果有电话参数
    $rs->contacts(undef,$phone)
    ,它将返回一个新的结果集,其中包含电话的附加搜索条件(
    SELECT*FROM contacts WHERE phone='…'
  • 如果同时存在电子邮件和电话参数
    $rs->contacts($email,$phone)
    ,它将返回一个新的结果集,其中包含两个附加搜索条件(
    SELECT*FROM contacts,其中email='…'和phone='…')

这是有道理的,但对于第一种情况来说。如果您不想缩小范围,那么您首先不会调用该方法,是吗?

这取决于您需要什么。
我在所有返回结果集的方法前面加上“搜索”前缀,所有返回单个对象的方法前面加上“查找”前缀。

?你想要第一条记录,还是想要一个可以用来做更多事情的预建结果集?我认为这个问题无法回答,这取决于你需要什么。您可以定义返回的结果是什么。
sub contact {
    my( $self, $email, $phone ) =  @_;

    my $user =  $self;
    $user =  $user->search({ email => $email })   if $email;
    $user =  $user->search({ phone => $phone })   if $phone;

    return $user;
}