2016-12-27 33 views
2

我有下面的代码:我应该从DBIx :: Class :: ResultSet :: *方法返回什么结果?

#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

+1

笏你想用它吗?你想要第一个记录,还是你想要一个可以用来做更多事情的预构建结果集? – simbabque

+0

我不认为这个问题可以回答,这取决于你需要什么。你可以定义返回结果是什么。 – dgw

回答

3

当您构建自定义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,但对于第一种情况。如果你不想缩小范围,你不会首先调用这种方法,对吗?

1

这取决于你需要什么。 我为所有返回ResultSets的方法加上'search_'和所有返回单个对象'find_'的前缀。

相关问题