如何创建与DBIx :: Class的嵌套has_many或belongs_to关系?

时间:2010-03-01 11:39:57

标签: sql perl dbix-class

在我的代码中,我有三个类,如下所示:ForumForum::ThreadForum::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:为简洁起见,省略了用于保存实际内容的其他列。

2 个答案:

答案 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表),那么您必须在关系语句中提供列名。