2011-05-24 81 views
4

我正在使用Catalyst框架中的DBIx :: Class。我的本地目標是在用戶之間添加新的多對多關係,比方說,任務。但是我需要一個小技巧。用戶可以在任務中擁有不同的角色(如「工作人員」或「旁觀者」)。DBIx:帶有附加屬性的類多對多關係

所以我用戶表這些字段:

  • ID

任務表這些字段:

  • ID
  • 標題
  • 描述

和我有關係表user_tasks這些領域:

  • user_id說明
  • TASK_ID
  • 作用

我有的has_many建立從用戶user_tasks,從的has_many任務user_tasks和相應用戶任務之間MANY_TO_MANY關係。這個平凡的部分就像它應該的那樣工作。

然後,例如,我想我的用戶列表,包括在任務由$ TASK_ID識別用戶的角色:

my $users = $schema->resultset('User')->with_task_role($task_id); 
while (my $u = $users->next) { 
    print "User: " . $u->name . ", role: " . $u->get_column('task_role'); 
} 

所以我應該怎麼編寫這個with_task_role定製的ResultSet得到這額外的字段用戶在我的查詢中的任務角色?

回答

4

首先多對多不是關係。這是一個訪問者(一個關係橋樑)。

其次,DBIx :: Class有一個很好的文檔。看看加入/預取。 在你的ResultSet/User.pm文件,你應該是這樣的:

sub with_task_role { 
    my ($self, $task_id) = @_; 

    return $self->search({ 
      'task.task_id' => $task_id, 
     }, 
     { 
      join  => { 'user_task' => 'task' }, 
      prefetch => { 'user_task' => 'task' }, 
     }, 
    ); 
} 

PS:對不起,我沒有看到,阿什利已經回答 PS2:最後一行之前「})」應爲「) 「only(fixed it)

+0

我已經知道DBIx :: Class有一個很好的文檔,因爲我先看了那裏。我已經嘗試了上面的這段代碼,但是它不能從這個查詢中獲得** user_tasks.role **字段! – 2011-05-24 15:58:48

+0

嗯。我請求原諒。這段代碼確實有效,那是我的實現,它沒有(我使用了連接或預取,而不是在一起)。 – 2011-05-24 16:12:28

+0

很高興聽到它的工作,它應該沒有預取工作也(只有加入),但然後你每次使用user_tasks或任何任何列時,你會打數據庫。 – 2011-05-24 16:20:43

2

這是DBIC master class(.xul資源)的XUL( 不再支持任何瀏覽器)幻燈片顯示的一些User結果集代碼。我強烈建議您下載幻燈片,以純文本形式閱讀,以供審閱。對我來說,他們對結果集非常開心。

你必須調整的結果源名稱以符合您自己,但 這應該是你想要的,更靈活一點與 _role_to_id它允許你通過角色對象或ID啓動。

sub with_role { 
    my ($self, $role) = @_; 
    $self->search({ 
     'role_links.role_id' => $role->id 
     }, 
     { join => 'role_links' } 
    ); 
    } 

    sub _role_to_id { 
    my ($self, $role) = @_; 
    return blessed($role) ? $role->id : $role; 
    } 

    sub with_any_role { 
    my ($self, @roles) = @_; 
    $self->search({ 
     'role_links.role_id' => { 
      -in => [ 
      map { $self->_role_to_id($_) } @roles 
      ] 
     } 
     }, 
     { join => 'role_links' } 
    ); 
    } 
+1

謝謝!這對於我在這方面的進一步工作非常有幫助,但是不能解決質疑的問題,將角色列添加到現有結果集而不會濾除角色。 – 2011-05-24 16:19:13

相關問題