Class::DBI - has_many Strikes Back!

d:id:babie:20051201:p2 でもやったんだけど、引数指定がよくわかってなかったので Class/DBI/Relationship/HasMany.pm を読んでリベンジ。

__PACKAGE__->has_many(accessor[, foreign_key][, args]])

アクセサ、外部キー、その他、の3つが指定できる。アクセサ以外は必須でない。


アクセサ:

accessor => foreign_class
accessor => [foreign_class, foreign_method]

の2つがある。

accessor は、このクラスのインスタンスから、外部テーブルデータを引っ張る時のアクセサ名。
foreign_class は、くっつけたい外部テーブルに対応する Class::DBI 派生クラス名。
foreign_method は、多対多の関連で中間テーブルの先のデータを引きたい時に、中間テーブルのメソッド名を指定する。
配列リファレンスを渡したり渡さなかったりするところがややこしい。


外部キー(省略可):
第2引数の foreign_key は、自テーブルの外部キー名を入れる。もちろん結合相手は外部テーブルのプライマリーキー。
飛ばして args を指定しても構わないところがややこしい。


その他(省略可):
最後の引数 args は、ハッシュリファレンスで渡す。指定できるキーは "order_by" のみ("sort" も使えるが既に deprecated)。SQL の ORDER BY 節に与える文字列をそのまま書けばよい。つまり、複数カラム指定、ASC/DESC も OK。
ソースを読むと "no_cascade_delete" なるキーも使えるようだ。この値が真ならば before_delete トリガーが定義されない。コメントに「アンドキュメンテッド&テストしてない!」と書いてある。使わない方がいいだろう。


こんなもんかな。みんな一発で理解できてるのかな? Perl には珍しく詳細な解説がググれなくて困ったよ。間違ってたらツッコんでください。


ところで、DBIx::Class::Loader の DESCRIPION に書いてある、

Class::DBI::Loader and Class::DBI are now obsolete, use DBIx::Class and this module instead. ;)

って、どうなの? Catalyst の Sebastian Riedel と Class::DBI の Tony Bowden の間でいざこざがあったので Sebastian が腹立ち紛れに書いたと思ってるんだが。モジュールで obsolete と言ったらもうメンテされない・廃止ってニュアンスを帯びると思うんだけど、この場合は字義通り「あんな古くさいの使うのやめて、こっち使いな」ぐらいか?