2010-03-01 1 views
2

В моем коде у меня есть три класса следующим образом: Forum, Forum::Thread и Forum::PostКак создать вложенную связь has_many или belongs_to с DBIx :: Class?

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

+0

Что вы ожидаете это вложенные отношений делать? Что означают '$ post-> forum' или' $ forum-> post' в этих условиях? Не можете ли вы просто использовать '$ post-> thread-> forum' и' для моего потока $ ($ forum-> threads) {для my $ post ($ thread-> posts) {}} 'делать то, что вы хотите ? –

+0

@Phillip Potter: Я немного опасаюсь заставлять; что я в конце концов хочу достичь с помощью '$ forum-> posts' является * одним * SQL-запросом, который извлекает все данные. $ post-> forum - это просто стенография форума $ post-> thread->, так что это менее интересно, я полагаю. –

+0

Я предлагаю вам подписаться на список рассылки DBIx :: Class и спросить там. Я не совсем уверен, как делать то, что вы просите. –

ответ

1

Похоже, что вложенные отношения невозможны. has_many принимает один иностранный класс, который имеет внешний ключ для вызывающего класса.

Хорошие новости $forum->threads->posts возвращает DBIx::Class::Resultset. Он не переведен на SQL до тех пор, пока не понадобится, поэтому, когда вы вызываете $forum->threads->posts->all() или даже что-то вроде $forum->search_related('threads',{},{rows=>25})->posts->all(), он запускает только один запрос.

Если ваша цель состоит в том, чтобы иметь $ пост-> форум, он всегда может быть методом: sub forum{$_[0]->thread->forum}

0

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