2

私のコードには、次の 3 つのクラスがForumありForum::Threadます。Forum::Post

私がやりたいことは、できればカスタム関数を作成せずに、クラスからForum::Postクラスへの属している関係を作成し、has_many を使用Forumしてその逆を作成することです。(これは確かに、技術的な制限や実際の問題というよりも知的作業ですが、可能であれば知りたいです。)

コメントアウトされた行には、関係に関する私の意図が含まれていますが、現在の形式では機能しません。ドキュメントを調べてみましたが、この特定のケースに関連するものは見つかりません。

ポインタはありますか?

フォーラム クラス:

package Schema::Result::Forum;

use Moose;
extends qw/DBIx::Class/;

__PACKAGE__->load_components (qw/Core/);
__PACKAGE__->table ('forum');

__PACKAGE__->add_columns (
    id => {
    is_auto_increment => 1,
    data_type         => 'integer',
  },
);

__PACKAGE__->set_primary_key ('id');

__PACKAGE__->has_many (threads => 'Schema::Result::Forum::Thread');
#This is the interesting line
#__PACKAGE__->has_many (posts => 'threads' => 'forums' );

1;

スレッドクラス:

package Schema::Result::Forum::Thread;

use Moose;
extends qw/DBIx::Class/;

__PACKAGE__->load_components (qw/Core/);
__PACKAGE__->table ('forum_thread');
__PACKAGE__->add_columns (
  id => {
    is_auto_increment => 1,
    data_type         => 'integer',
  },
  forum => {
    data_type         => 'integer',
  },
);

__PACKAGE__->set_primary_key ('id');

__PACKAGE__->belongs_to (forum => 'Schema::Result::Forum');
__PACKAGE__->has_many (posts => 'Schema::Result::Forum::Post');

1;

投稿クラス:

package Schema::Result::Forum::Post;

use Moose;

extends qw/DBIx::Class/;

__PACKAGE__->load_components (qw/Core/);

__PACKAGE__->table ('forum_post');

__PACKAGE__->add_columns (
  id => {
    is_auto_increment => 1,
    data_type         => 'integer',
  },
  thread => {
    data_type         => 'integer',
  },
);

__PACKAGE__->set_primary_key ('id');

__PACKAGE__->belongs_to (thread => 'Schema::Result::Forum::Thread');
#This is the other interesting line
#__PACKAGE__->belongs_to (forum => 'thread' => 'forum');

1;

PS:簡潔にするために、実際のコンテンツを保持するための追加の列は省略されています。

4

2 に答える 2

1

ネストされた関係は不可能のようです。has_many は、呼び出し元のクラスへの外部キーを持つ単一の外部クラスを取ります。

良いニュースは$forum->threads->posts、単一の を返すことDBIx::Class::Resultsetです。必要になるまで SQL に変換されないため、$forum->threads->posts->all()または のようなものを呼び出すと$forum->search_related('threads',{},{rows=>25})->posts->all()、単一のクエリのみが実行されます。

あなたの目標が $post->forum を持つことである場合、それは常にメソッドになることができます:sub forum{$_[0]->thread->forum}

于 2010-03-19T05:31:53.473 に答える
0

使用しているデータベースとエンジンの種類は何ですか? 外部キーがない場合 (たとえば、MySQL の myisam テーブルなど)、リレーションシップ ステートメントで列名を指定する必要があります。

于 2010-03-17T18:51:59.693 に答える