當您構建自定義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