2011-05-24 89 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