というか、findとの違いがいまいち。searchは分かるのでいいとして、
DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org
Inflates the first result without creating a cursor if the resultset has any records in it; if not returns nothing. Used by "find" as an optimisation.
カーソルを作らずに最初の結果をインフレートする、ただし結果がない場合はなにも返さない。
じゃぁ、findって何?ってことになるわけだが。
findって主キーから探すときにしか使ってなかったけど、ユニーク制約かけてあるとこから探してもいいのね。知らんかった。
DBIx::Class::ResultSet - Responsible for fetching and creating resultset. - search.cpan.org
Finds a row based on its primary key or unique constraint.
singleだと
Return Value: $row_object?
と?がついているのに、findは
Return Value: $row_object
となっているということは、singleはオブジェクトを返すかもしれないし返さないかもしれないのに対し、findの場合は必ずオブジェクトが返ってくるということか。
じゃぁ、ユニーク制約はどこでどうすんの?ってことだけど、 add_unique_constraintにあるようにDBICに制約属性ふっておけばいいらしいので、DBICが制約が張られているのをチェックしてよきに計らってくれるのだろう。(確認してないけど)
というわけで、多対多とか一対多の場合に制約属性ふっておくと検索するときに楽になるのね。