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

时间:2016-12-27 17:05:59

标签: 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 })   if $phone;

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

可以在我的ArtCoin::Schema::ResultSet::User包裹中返回Result吗?

2 个答案:

答案 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 _'的方法。