Re: [CDBI] one to one relationship

David Westbrook <dwestbrook-CdwZJljFklFeQHgVHX0xRVaTQe2KTcn/@public.gmane.org>
Newsgroups gmane.comp.lang.perl.modules.class-dbi
Message-ID <[email protected]>
I think this should do what you want:
( ==> as a side note don't use "timestamp" as a column name since it's a 
reserved word .. maybe "created_date" or "query_timestamp" or something)

package Foo::DBI;
use base 'Class::DBI';
__PACKAGE__->connection( ... );

package Foo::RequestedQuery;
use base 'Foo::DBI';
__PACKAGE__->table('requested_queries');
__PACKAGE__->columns( Primary => qw/requested_query_id/ );
__PACKAGE__->columns( Essential => qw/query_id firstname surname email/);

package Foo::Query;
use base 'Foo::DBI';
__PACKAGE__->table('queries');
__PACKAGE__->columns( Primary => qw/query_id/ );
__PACKAGE__->columns( Essential => qw/search timestamp /);
__PACKAGE__->has_many( requested => 'Foo::RequestedQuery' );

#########
package main;
my $q = Foo::Query->retrieve( $query_id );
$q->add_to_requested({
  firstname => 'Joe',
  surname => 'Bloggs',
  query_id => $query_id,
  email => $email,
});

#########
Note also that, in general, you can pass a hashref to create:
my $new_row = Foo::Bar->create({ blah => 1234, stuff => 'qwe', some_id 
=> $x });

--david

brett gardner wrote:

> What is the best way to define a one to one relationship in Class::DBI?
>
> I have a table of queries where a user can do a basic search for 
> services. Then, if they want more information on their search, they 
> can fill in their details which populates a request. Nine times out of 
> ten the user will not be requesting any more info so I have created 
> two tables, "queries" and "requested_queries".
>
> queries
> -------------
> | query_id  |
> | search    |
> | timestamp |
> -------------
>
> requested_queries
> ----------------------
> | requested_query_id |
> | query_id           |
> | firstname          |
> | surname            |
> | email              |
> ----------------------
>
> Now is there anyway in Class::DBI to setup a relationship whereby I 
> could code the following (for an existing query that does not yet have 
> a matching requested query)
>
> $query->requested_query->create();
> $query->requested_query->firstname('Joe');
> $query->requested_query->surname('bloggs');
> $query->requested_query->update();
>
> I tried using "might_have", but this fails as both the "firstname" and 
> "surname" are required fields. And as soon as I call 
> "$query->firstname('joe');" it tries to run the insert statement 
> without waiting for the "$query->update" call.
>
> Cheers
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.