В моем коде у меня есть три класса: Forum
, Forum::Thread
и Forum::Post
Что я хочу сделать, так это создать отношение «принадлежит_к» от класса Forum::Post
к классу Forum
и наоборот с помощью has_many, предпочтительно, без создания для него пользовательской функции. (По общему признанию, это больше интеллектуальное упражнение, чем техническое ограничение или реальная проблема, но если это возможно, я бы очень хотел знать.)
Закомментированные строки содержат мое намерение относительно отношений, но в их нынешнем виде они не работают. Я рылся в документации, но не нашел ничего, относящегося к этому конкретному случаю.
Любые указатели?
Класс форума:
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: Дополнительные столбцы для хранения фактического содержания были опущены для краткости.
$post->forum
или$forum->post
в этих условиях? Разве вы не можете просто использовать$post->thread->forum
иfor my $thread ($forum->threads) { for my $post ($thread->posts) { } }
, чтобы делать то, что вы хотите? - person Philip Potter   schedule 03.03.2010$forum->posts
, — это один SQL-запрос, который извлекает все данные. $post-›forum на самом деле просто сокращение от $post-›thread-›forum, так что, я полагаю, это менее интересно. - person Williham Totland   schedule 04.03.2010