jdtoronto has asked for the wisdom of the Perl Monks concerning the following question:

Esteemed Monks,

Your grateful supplicant comes before you yet again, seeking Wisdom:

I have two tables declared in my Class::DBI module:

package InContact::cDBI::contactdetail; use base 'InContact::cDBI'; __PACKAGE__->set_up_table('contactdetail'); __PACKAGE__->has_a('contact_id' => 'InContact::cDBI::contact'); package InContact::cDBI::contact; use base 'InContact::cDBI'; __PACKAGE__->set_up_table('contact'); __PACKAGE__->has_many('contact_detail' => 'InContact::cDBI::contactdet +ail', 'contact_id');
What I need to find is the records in InContact::cDBI::contact which have corresponding records in InContact::cDBI::contactdetail where the value of the recontact field in the InContact::cDBI::contactdetail is a certain date. So I ran the following code:
my $details = InContact::cDBI::contact->contact_detail(recontact = +> $tm); print Dumper $details;
and what do I get? I get an interator (quite okay) but it is telling me which InContact::cDBI::contactdetail records are involved, what I need is the InContact::cDBI::contact records that point to those! This is the actual output from Data::Dumper:
$VAR1 = bless( { '_data' => [ { 'id' => '6' }, { 'id' => '7' } ], '_place' => 0, '_mapper' => [], '_class' => 'InContact::cDBI::contactdetail'
What am I missing here folks?

jdtoronto

Replies are listed 'Best First'.
Re: Class::DBI not giving me what I need!
by NetWallah (Canon) on Oct 05, 2004 at 16:58 UTC
    I think you are missing the

    $obj = Class->retrieve( %key_values );

    In your case, that would be something like:

    foreach my $Contact(InContact::cDBI::contact->contact_detail(recontac +t => $tm)){ my @cols= $Contact->columns; }

        Earth first! (We'll rob the other planets later)

Re: Class::DBI not giving me what I need!
by Arunbear (Prior) on Oct 05, 2004 at 21:32 UTC
    my $details = InContact::cDBI::contact->contact_detail(recontact = > $tm);

    This doesn't work because the contact_detail method created by has_many is an instance method - if you already had an object $obj of class InContact::cDBI::contact returned by retrieve or search then you could say

    my @details = $obj->contact_detail(recontact = > $tm);

    You can do something like

    my @contacts = map { $_->contact_id } InContact::cDBI::contactdetail-> +search(recontact = > $tm);
    and then filter out the duplicates.

    But I think you will need to use set_sql to do the kind of search you have in mind (can't give an example because I don't know what your fields are).

      Actually, has_many works fine as a class method. You're right about the rest though.