[prev] [thread] [next] [Date index for 2004/08/10]
I'm not so bothered about avoiding the need to create an accessor; the
method which creates both objects will sit outside either.
But I can't get it to work.
I've tried calling $class->sth_to_objects($sth) or $class->construct
repeatedly for each class, and although the first resulting object is
fine, the second doesn't contain all the fields from the initiating hash
- least of all its primary key. There's a large chance that I'm missing
something, but it looks to me that something's going wrong inside
Class::DBI::_init.
It seems to be pulling a broken something out of Live_Objects. Despite
the fact that there's nothing in Live_Objects. From the Perl debugger:
526: unless (defined($obj =3D $Live_Objects{$obj_key})) {
DB<5> p $obj_key
Conquer::Persist::ActiveRecord::PC|cha_id=3D55
DB<7> p %Live_Objects
DB<11> p Dumper(%Class::DBI::Live_Objects)
DB<12> p $Live_Objects{$obj_key}
Use of uninitialized value in print at (eval
83)[/usr/local/perl-5.6.1/lib/perl5/5.6.1/perl5db.pl:1521] line 2.
DB<13> p $obj
Use of uninitialized value in print at (eval
84)[/usr/local/perl-5.6.1/lib/perl5/5.6.1/perl5db.pl:1521] line 2.
DB<14> p $obj =3D $Live_Objects{$obj_key}
Use of uninitialized value in print at (eval
85)[/usr/local/perl-5.6.1/lib/perl5/5.6.1/perl5db.pl:1521] line 2.
DB<15> p defined($obj =3D $Live_Objects{$obj_key})
DB<16> p $obj
Use of uninitialized value in print at (eval
87)[/usr/local/perl-5.6.1/lib/perl5/5.6.1/perl5db.pl:1521] line 2.
DB<17> s
Class::DBI::_init(/home/ianm/conquer/cgi-bin/lib/Class/DBI.pm:542):
542: return $obj;
DB<17> p $obj
Conquer::Persist::ActiveRecord::PC
DB<18> p Dumper($obj)
$VAR1 =3D bless( {
'sso_user_id' =3D> undef,
... (partial list of fields, none of which have
true values, deleted)
}, 'Conquer::Persist::ActiveRecord::PC' );
DB<19>=20
-----Original Message-----
From: Perrin Harkins [mailto:perrin@xxxx.xxx]=20
Sent: 09 August 2004 16:56
To: brano@xxxxxxxxxx.xx
Cc: cdbi-talk@xxxxxx.xxxxx.xxx
Subject: Re: No way to instantiate two related CDBI classes at once,
isthere?
It can be done.
package Foo;
__PACKAGE__->set_sql(get_both =3D> qq{
SELECT foo.id, foo.other, bar.id, bar.other
FROM __TABLE__
WHERE foo.a =3D ?
};
sub retrieve_with_bar {
my ($class, $id) =3D @_;
my $sth =3D $class->sq_get_both();
$sth->execute($id);
my $row =3D $sth->fetchrow_arrayref();
my $foo =3D Foo->construct($row->[0,1]);
my $bar =3D Bar->construct($row->[2,3]);
$foo->{'_bar_object'} =3D $bar;
return $foo;
}
sub bar {
my $self =3D shift;
return $self->{'_bar_object'};
}
If you read through the Class::DBI::Relationship::MightHave source, you
can see how to make it store the object just like the normal might_have
method does, and avoid the need to create your own accessor. That would
certainly violate encapsulation, and my example here has
retrieve_with_bar tightly coupled to the SQL statement, but it should
work.
- Perrin
http://www.bbc.co.uk/ - World Wide Wonderland
This e-mail (and any attachments) is confidential and may contain
personal views which are not the views of the BBC unless specifically
stated.
If you have received it in error, please delete it from your system.=20
Do not use, copy or disclose the information in any way nor act in
reliance on it and notify the sender immediately. Please note that the
BBC monitors e-mails sent or received.=20
Further communication will signify your consent to this.
|
RE: No way to instantiate two related CDBI classes at once, isthere?
|
|
RE: No way to instantiate two related CDBI classes at once, isthere?
|
Generated at 11:34 on 01 Dec 2004 by mariachi v0.52