2016-12-27 72 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_'的前綴。

相關問題