[% WHILE %] の中のこと その後 (日々のこと)
と、思っていたら、多対多のときには _rs ではできないね。

そうそう。忘れてました。many-to-manyではできないんですね。
これはドキュメントにもちゃんと書いてあって

DBIx::Class::Relationship - Inter-table relationships - search.cpan.org
Many_to_many is not strictly a relationship in its own right. Instead, it is a bridge between two resultsets which provide the same kind of convenience accessors as true relationships provide. Although the accessor will return a resultset or collection of objects just like has_many does, you cannot call $related_resultset and similar methods which operate on true relationships.

つまりhas_manyと同じようにアクセサを使えるけど、$related_resultsetなメソッドは使えないので下の例だとentries_rsなんてメソッドは使えないと。

package MT::Schema::Category;

use strict;

__PACKAGE__->has_many(
    placement => 'MT::Schema::Placement',
    'placement_category_id',
);
__PACKAGE__->many_to_many(
    entries => 'placement',
    'entry',
);

1;

ちなみに

$category->search_related('entries', {})

とか*_related関連メソッドも、そんなリレーション知らんと、怒られます。

なので、面倒だけど僕はmany-to-manyな関係を持つテーブルには

sub entries_rs { 
    my $rs = shift->entries->count
    return $rs;
}

なんてメソッドくっつけてます。

またはDBIx::Class::Relationship::ManyToManyをhackして

*{"${class}::${meth}_rs"} = sub {
  my $self = shift;

  my $rs = $self->${meth}(@_);
  return $rs;
};

ってメソッドをつけるのもありかもですね。

              

              

トラックバック(0)

トラックバックURL: http://mt.hide-k.net/mt-tb.cgi/674

コメント(2)

こんにちわ、さわです。
ちゃんとドキュメントに書いてあるんですね。
知りませんでした・・・。

さわさま>
どもです。
実はボクも最近まで知りませんでした。あの辺のドキュメントはちょっとわかりにくいですね。

コメントする

プロフィール

このブログ記事について

このページは、hideが2007年5月22日 15:54に書いたブログ記事です。

ひとつ前のブログ記事は「TTでDBICのhas_manyなメソッドを使う」です。

次のブログ記事は「C::P::FillInForm::ForceUTF8 updated to 0.02」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。