如何解决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 举报,一经查实,本站将立刻删除。