微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DBIx:类具有附加属性的多对多关系

如何解决DBIx:类具有附加属性的多对多关系

|| 我正在Catalyst框架中使用DBIx :: Class。我的本地目标是在用户与任务之间添加新的多对多关系。但是,我需要一个小技巧。用户在任务中可以具有不同的角色(例如\'worker \'或\'pectator \')。 所以我有这些字段的用户表: ID 名称 我有这些字段的任务表: ID 标题 描述 我有与这些字段的关系表user_tasks: 用户身份 task_id 角色 我已经建立了从用户用户任务的has_many,从任务到用户任务的has_many以及用户和任务之间的对应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自定义结果集,以在查询中获得具有用户任务角色的其他字段?     

解决方法

首先,多对多不是一种关系。它是访问器(关系桥)。 其次,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:对不起,我没有看到Ashley已经回答 PS2:最后一行之前的\“})\”应该仅是\“)\”(固定)     ,这是一些XUL的
User
结果集代码, 不再受任何浏览器支持)DBIC幻灯片 大师班(.xul资源)。我强烈建议下载幻灯片,以纯文本形式阅读,以便进行检查。对于我来说,它们使结果集大开眼界。 您必须调整结果源名称以匹配您自己的名称,但 这应该是您想要的,并且可以更灵活地启动
_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\' }
    );
  }
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。