Many-to-Many with just on table plus linking table
[prev]
[thread]
[next]
[Date index for 2005/04/04]
I decided to finally look into Class::DBI, and I'm already quite lost. The
documentation is a bit spotty and chaotically mixes low-level and high-level
bits. I'll happily offer some patches, but first I need to figure out what's
going on myself. (The wiki did not offer clarification on this matter)
I have a table of data. I have a second table that lists relationships
between items in the first table.
For example, the data table may hold 10 items. The relationship table
may list:
1 2
1 3
1 4
5 6
5 7
5 8
(both columns refer to the same primary key of the data table)
Following the Actor/Film/Role example from the docs, I tried:
package Forum::DBI;
use base 'Class::DBI::SQLite';
use DBI;
Forum::DBI->connection('dbi:SQLite:dbname=/var/db/site.db', '', '');
#########################################
package Forum::Topic;
use base 'Forum::DBI';
Forum::Topic->table('forum_relations');
Forum::Topic->columns(Primary => qw/message topic/);
Forum::Topic->has_a(message => 'Forum::Message');
Forum::Topic->has_a(topic => 'Forum::Message');
#########################################
package Forum::Message;
use base 'Forum::DBI';
Forum::Message->table('forum_posts');
Forum::Message->columns(All => qw(id title body));
Forum::Message->has_many(messages => [Forum::Topic => 'message']);
Forum::Message->has_many(topics => [Forum::Topic => 'topic']);
And the code:
my $topic = Knight::Forum::Message->create({title => 'Topic 1', body => 'Foo'});
my $message = Knight::Forum::Message->create({title => 'msg 1', body => 'Bar'});
$message->add_to_topics({
topic => $topic,
});
But I get:
Can't create Forum::Topic object with null primary key columns () at /usr/local/share/perl/5.8.4/Class/DBI/Relationship/HasMany.pm line 89
It turns out that add_to_topics() wants a 'message' value passed, and
add_to_messages wants a 'topic' value passed, with the result of switching the
meanings of my columns. If I try to be explicit and list both values, it
ignores what I passed.
add_to_* is only barely defined in the documentation, so I've been unsuccessful
in determing what I've done wrong. Given that the code runs if I meet the
expectations, that makes it out to be a logical error on my part, but I can't
see how my sample is significantly different from the Film/Actor/Role example
in the docs.
What am I missing?
Thanks in advance.
--
SwiftOne / Brett Sanger
swiftone@xxxxxxxx.xxx
|
Many-to-Many with just on table plus linking table
Brett Sanger 19:03 on 04 Apr 2005
|