DBIx:带有附加属性的类多对多关系
我正在使用Catalyst框架中的DBIx :: Class。我的本地目标是在用户之间添加新的多对多关系,比方说,任务。但是我需要一个小技巧。用户可以在任务中拥有不同的角色(如“工作人员”或“旁观者”)。DBIx:带有附加属性的类多对多关系
所以我用户表这些字段:
- 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定制的ResultSet得到这额外的字段用户在我的查询中的任务角色?
首先多对多不是关系。这是一个访问者(一个关系桥梁)。
其次,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:对不起,我没有看到,阿什利已经回答 PS2:最后一行之前“})”应为“) “only(fixed it)
这是DBIC master class(.xul资源)的XUL( 不再支持任何浏览器)幻灯片显示的一些User
结果集代码。我强烈建议您下载幻灯片,以纯文本形式阅读,以供审阅。对我来说,他们对结果集非常开心。
你必须调整的结果源名称以符合您自己,但 这应该是你想要的,更灵活一点与 _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' }
);
}
谢谢!这对于我在这方面的进一步工作非常有帮助,但是不能解决质疑的问题,将角色列添加到现有结果集而不会滤除角色。 – 2011-05-24 16:19:13
我已经知道DBIx :: Class有一个很好的文档,因为我先看了那里。我已经尝试了上面的这段代码,但是它不能从这个查询中获得** user_tasks.role **字段! – 2011-05-24 15:58:48
嗯。我请求原谅。这段代码确实有效,那是我的实现,它没有(我使用了连接或预取,而不是在一起)。 – 2011-05-24 16:12:28
很高兴听到它的工作,它应该没有预取工作也(只有加入),但然后你每次使用user_tasks或任何任何列时,你会打数据库。 – 2011-05-24 16:20:43