在我的代码中,我有三个类,如下所示:Forum
,Forum::Thread
和Forum::Post
我想要做的是创建一个从Forum::Post
类到Forum
类的belongs_to-relationship,反之亦然,使用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:为简洁起见,省略了用于保存实际内容的其他列。
答案 0 :(得分:1)
看起来嵌套关系是不可能的。 has_many接受一个外部类,它有一个调用类的外键。
好消息是$forum->threads->posts
会返回一个DBIx::Class::Resultset
。它在需要之前不会被翻译成SQL,因此当您调用$forum->threads->posts->all()
或类似$forum->search_related('threads',{},{rows=>25})->posts->all()
之类的内容时,它只会运行一个查询。
如果你的目标是建立一个$ post->论坛,那么它总是一种方法:sub forum{$_[0]->thread->forum}
答案 1 :(得分:0)
您使用的是什么数据库和引擎类型?如果您没有外键(例如,在MySQL中使用myisam表),那么您必须在关系语句中提供列名。