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;
}