我有下一个代码:
#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
吗?
答案 0 :(得分:2)
构建自定义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()
,它将返回与以前相同的ResultSet,没有任何新的搜索条件(SELECT * FROM contacts
)$rs->contact($email)
,它将返回一个新的ResultSet,其中包含电子邮件的其他搜索条件(SELECT * FROM contacts WHERE email='...'
)$rs->contacts( undef, $phone )
,它将返回一个新的ResultSet,其中包含电话的其他搜索条件(SELECT * FROM contacts WHERE phone='...'
)$rs->contacts( $email, $phone )
,它将返回一个新的ResultSet,其中包含两个额外的搜索条件(SELECT * FROM contacts WHERE email='...' AND phone='...'
)这是有道理的,但对于第一种情况。如果你不想缩小范围,你不会首先调用那种方法,不是吗?
答案 1 :(得分:1)
这取决于你需要什么。 我在返回带有'search_'的ResultSets的所有方法前面加上所有返回单个对象'find _'的方法。