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

前端之家收集整理的这篇文章主要介绍了perl – DBIx:与附加属性的多对多关系前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用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:在最后一行之前“})”应该是“)”只有(修复它)

猜你在找的Perl相关文章