加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – DBIx:与附加属性的多对多关系

发布时间:2020-12-16 06:22:17 所属栏目:大数据 来源:网络整理
导读:我正在使用Catalyst框架中的DBIx :: Class.我的本地目标是在用户之间添加新的多对多关系,比方说,任务.但是我需要一个小技巧.用户可以在任务中扮演不同的角色(如“工人”或“旁观者”). 所以我有这些字段的用户表: id 名字 我有这些字段的任务表: id 标题
我正在使用Catalyst框架中的DBIx :: Class.我的本地目标是在用户之间添加新的多对多关系,比方说,任务.但是我需要一个小技巧.用户可以在任务中扮演不同的角色(如“工人”或“旁观者”).

所以我有这些字段的用户表:

> 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自定义结果集来在我的查询中使用用户的任务角色来获取这个附加字段?

解决方法

首先,多对多不是一种关系.它是一个访问者(一个关系桥梁).

其次,DBIx :: Class有一个很好的文档.看一下join / prefetch.
在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:在最后一行之前“})”应该是“)”只有(修复它)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读