我正在使用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'); }
解决方法
首先,多对多不是一种关系.它是一个访问者(一个关系桥梁).
其次,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:在最后一行之前“})”应该是“)”只有(修复它)