当您构建自定义ResultSet时,通常会返回新的ResultSet对象。在the documentation的例子中包含一个隐含的return
。
sub active {
my $self = shift;
$self->search({ $self->current_source_alias . '.active' => 1 });
}
因为没有return
,它只是返回的最后一条语句的返回值。这是$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;
}
记住ResultSet是不实际的结果。目前还没有任何问题。如果您在方法中调用了->first
,它将与数据库交谈并运行您的查询。之后,您无法将额外的search
es链接到ResultSet,因为您没有更多的ResultSet。
以下部分是一个位代码审查的。
你在那里做的很好,但是有点复杂。您正在链接最多两个额外的搜索,这可以转化为DBIC在后台为您做的更多内容。考虑该方法应该如何表现。
眼下,它这样做:
- 如果没有参数
$rs->contact()
,它会像以前一样返回相同的结果集,没有任何新的搜索标准(SELECT * FROM contacts
)
- 如果有电子邮件的说法如果有电话参数
$rs->contacts(undef, $phone)
,它将返回一个新的ResultSet,它具有电话的附加搜索条件(),它将返回一个具有电子邮件附加搜索条件的新ResultSet(SELECT * FROM contacts WHERE email='...'
)
- 如果有电话参数
$rs->contacts(undef, $phone)
,)
- 如果有电子邮件和手机参数
$rs->contacts($email, $phone)
,它将返回有两个附加的搜索条件(SELECT * FROM contacts WHERE email='...' AND phone='...'
)
这是有道理的一个新的ResultSet,但对于第一种情况。如果你不想缩小范围,你不会首先调用这种方法,对吗?
笏你想用它吗?你想要第一个记录,还是你想要一个可以用来做更多事情的预构建结果集? – simbabque
我不认为这个问题可以回答,这取决于你需要什么。你可以定义返回结果是什么。 – dgw