Perl 在DBIx::Class中使用自联接的组组

Perl 在DBIx::Class中使用自联接的组组,perl,dbix-class,Perl,Dbix Class,我试图理解如何使用DBIx::Class 如果我想要记录组,以便组本身可以是组的成员,我可以创建一个模式,其中包括以下内容: CREATE TABLE groups ( id INTEGER PRIMARY KEY, name VARCHAR(100) ); CREATE TABLE group_groups ( parent_id INTEGER REFERENCES groups(id), chi

我试图理解如何使用DBIx::Class

如果我想要记录组,以便组本身可以是组的成员,我可以创建一个模式,其中包括以下内容:

CREATE TABLE groups (
       id    INTEGER PRIMARY KEY,
       name  VARCHAR(100)
       );

CREATE TABLE group_groups (
       parent_id         INTEGER REFERENCES groups(id),
       child_id          INTEGER REFERENCES groups(id),
       PRIMARY KEY(parent_id,child_id)
       );
__PACKAGE__->has_many(
  "group_groups_parents",
  "Schema::Result::GroupGroup",
  { "foreign.child_id" => "self.id" },
  { cascade_copy => 0, cascade_delete => 0 },
);

__PACKAGE__->has_many(
  "group_groups_children",
  "Schema::Result::GroupGroup",
  { "foreign.parent_id" => "self.id" },
  { cascade_copy => 0, cascade_delete => 0 },
);
如果使用DBIx::Class::Schema::Loader转储此架构,则会得到以下关系:

下午三时 GroupGroup.pm 我想我需要一个多对多的关系桥梁,在这个桥梁上,组表位于两侧,所以我创建了这个:

__PACKAGE__->many_to_many(
    'childgroups' => 'group_groups_children' , 'child');

__PACKAGE__->many_to_many(
    'parents' => 'group_groups_parents' , 'parent');
由于我对关系桥定义的理解是这样的:“访问器名称”=>“的名称在相关表中有很多关系”,“的名称属于相关表中的关系”

当我尝试此代码时:

my $group_rs = $schema->resultset('Group')->search(
        { id => $id }
);
my $group = $group_rs->first;
foreach my $child ($group->childgroups) {
<snip>
但我认为这句话应该更像:

SELECT child.id, child.name FROM group_groups me 
       JOIN groups child ON child.id = me.child_id 
       JOIN groups parent ON parent.parent_id = me.id 
       WHERE ( me.child_id = ? )
如果有人建议我如何误解多对多关系桥梁,并纠正我的多对多函数定义,我将不胜感激。

在dbix类中询问时,ribasushi帮助我解决了这个问题。显然,DBIC::Schema::Loader在Group.pm中创建了许多关系,它应该如下所示:

CREATE TABLE groups (
       id    INTEGER PRIMARY KEY,
       name  VARCHAR(100)
       );

CREATE TABLE group_groups (
       parent_id         INTEGER REFERENCES groups(id),
       child_id          INTEGER REFERENCES groups(id),
       PRIMARY KEY(parent_id,child_id)
       );
__PACKAGE__->has_many(
  "group_groups_parents",
  "Schema::Result::GroupGroup",
  { "foreign.child_id" => "self.id" },
  { cascade_copy => 0, cascade_delete => 0 },
);

__PACKAGE__->has_many(
  "group_groups_children",
  "Schema::Result::GroupGroup",
  { "foreign.parent_id" => "self.id" },
  { cascade_copy => 0, cascade_delete => 0 },
);
原件:

has_many (group_groups_children => "Schema::Result::GroupGroup", { "foreign.child_id" => self.id" } )
意思是“所有在child_id中有我的id的行”,实际上是父母在他们的child.id中有我的id,而不是孩子

我的模式是好的,我的关系定义是好的,我的使用代码是好的,只是自动生成的关系不是好的,我的理解不足以发现失败

ribasushi暗示,命名约束(即模式的“更好”DDL)可能会导致DBICSL正确使用它

has_many (group_groups_children => "Schema::Result::GroupGroup", { "foreign.child_id" => self.id" } )