Как мне создать вложенные отношения has_many или own_to с DBIx :: Class? - PullRequest
2 голосов
/ 01 марта 2010

В моем коде у меня есть три класса следующим образом: Forum, Forum::Thread и Forum::Post

То, что я хочу сделать, это создать отношение own_to из класса 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: Дополнительные столбцы для хранения фактического содержимого для краткости опущены.

Ответы [ 2 ]

1 голос
/ 19 марта 2010

Похоже, что вложенные отношения невозможны. 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}

0 голосов
/ 17 марта 2010

Какую базу данных и тип двигателя вы используете? Если у вас нет внешних ключей (как, например, в таблицах myisam в MySQL), вам придется указывать имена столбцов в выражениях отношений.

...