[Dbix-class] Setup relationship for 'modified preorder tree
traversal' structure
Charlie Garrison
garrison at zeta.org.au
Sun Jun 24 20:59:29 GMT 2007
Good morning,
I am using 'modified preorder tree traversal' for one of my
tables and I'm having trouble working out how to create the
relationship for descendant records.
The table looks like (simplified):
CREATE TABLE access_tree (
atr_key int(10) unsigned NOT NULL auto_increment,
participant_key int(10) unsigned DEFAULT '0' NOT NULL,
lft bigint(21) unsigned DEFAULT '0' NOT NULL,
rgt bigint(21) unsigned DEFAULT '0' NOT NULL,
PRIMARY KEY (atr_key),
KEY participant_key (participant_key),
KEY lft (lft),
KEY rgt (rgt)
);
My model looks like this (simplified):
package RPDB::AccessTree;
use base 'DBIx::Class';
use strict;
use warnings;
__PACKAGE__->load_components(qw/ Core /);
__PACKAGE__->table('access_tree');
__PACKAGE__->add_columns(qw/ atr_key participant_key lft rgt /);
__PACKAGE__->set_primary_key('atr_key');
__PACKAGE__->belongs_to(user => 'RPDB::User', 'atr_key'); #
reverse rel setup in RPDB::User
__PACKAGE__->belongs_to(participant => 'RPDB::Participant', 'participant_key');
__PACKAGE__->has_many(descendants => 'RPDB::AccessTree',
{ 'foreign.lft' => { -between => [ 'self.lft', 'self.rgt' ]
} },
{ cascade_delete => 0 }
);
And I am using the relationship in my controller:
my $descendants = $c->user->atr->descendants;
Which generates an error like:
"DBIx::Class::Relationship::Accessor::__ANON__(): Invalid rel
cond val HASH(0x1e31984)
I haven't been able to find examples of more complex join
criteria; I ended up with the above following the manual...
From DBIC::Relationship::Base:
The condition needs to be an SQL::Abstract-style representation
of the join between the tables.
From SQL::Abstract:
You can use this same format to use other grouping functions,
such as BETWEEN, SOME, and so forth. For example:
my %where = (
user => 'nwiger',
completion_date => {
-not_between => ['2002-10-01', '2003-02-06']
}
);
If anyone can show me where I'm going wrong and how I should
create the join criteria (or some other way of approaching
this), then I would appreciate it.
Thanks,
Charlie
--
Charlie Garrison <garrison at zeta.org.au>
PO Box 141, Windsor, NSW 2756, Australia
O< ascii ribbon campaign - stop html mail - www.asciiribbon.org
http://www.ietf.org/rfc/rfc1855.txt
More information about the Dbix-class
mailing list