Hello,

Thanks for your reply, Matt. I've boiled down code from my Catalyst project as 
follows.
A bit disconcerting that the problem remains even though I've refactored it 
into a command line program. 

In CatMgrDB::Listing below, I have added a number from 1 to 4 after the 
comment, so that 4 different relationships can be tried.

When the relation in Listing.pm is "belongs_to" (i.e. case 4) inflation works 
and the output is:
# ./reltest.pl
Name: Telebody Inc.
Offer: Free website estimate

However when it is changed to "might_have" (case 1) the output is:
# ./reltest.pl
Name: Telebody Inc.
Coupon is undefined

It also fails for case 2 (has_one) but (why??) it works for case 3 (wierd 
misuse of has_one, I think).

Listings follow.

Any light you can shed on this would be greatly appreciated. 

Meanwhile I have discovered something interesting, if I delete a coupon without 
zeroing the listing.coupon field, a new coupon with the same id is autovivified 
but with zeroes in all other fields. Which makes it impossible to delete with 
the existing code that looks at coupon.listing ...

I really would like a way to disable autovivification. I don't believe it is 
"doing the right thing" if it keeps surprising me. Well I suppose I should be 
using might_have (if inflation would work with it) or allow nulls in the table.

Incidentally the person asking about a design tool might be interested in 
dbdesigner which will import/export from uml diagram to mysql and postgresql. 
Though I think the arrows need to be smarter, the diagram it made from my db 
was clean but had too many arrows to read easily. 
http://fabforce.net/dbdesigner4/

Thank you very much, and regards from Tokyo where the rainy season seems to be 
starting..

Matt Rosin

[EMAIL PROTECTED] [/app/reltest]# ls -R
.:
./  ../  CatMgrDB/  CatMgrDB.pm*  reltest.pl*
./CatMgrDB:
./  ../  Coupon.pm  Listing.pm*

[EMAIL PROTECTED] [/app/reltest]# cat reltest.pl
#!/usr/local/bin/perl -w
# by Matt Rosin
use strict;
use warnings;
use CatMgrDB;
# this was a catalyst connection using config(schema_class => 'CatMgrDB_Model', 
...)
my ($DBUSER, $DBPASS) = ('lalala','lalala');
my $schema = CatMgrDB->
  connect('dbi:mysql:TABLENAME',$DBUSER,$DBPASS,{'AutoCommit' => '1'});

# would be CatMgrDB::Listing->find(4499);
my $listing = $schema->resultset('CatMgrDB::Listing')->find(4499);
print "Name: " . $listing->name . "\n";
my $coupon = $listing->coupon;
if (defined $coupon) { print "Offer: " . $coupon->offer . "\n"; }
else { print "Coupon is undefined\n"; }

[EMAIL PROTECTED] [/app/reltest]# cat CatMgrDB.pm
package CatMgrDB;
# pulled code out of Catalyst modules
use base qw/DBIx::Class::Schema/;
__PACKAGE__->load_classes({ CatMgrDB => [qw/Listing Coupon/] });
1;

[EMAIL PROTECTED] [/app/reltest]# cat CatMgrDB/Listing.pm
package CatMgrDB::Listing;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('listing');
__PACKAGE__->add_columns(qw/id category customer banner whitepages type flagged 
disabled name address address2 city state zip phone offertext site directions 
locations menu template usermemo adminmemo codememo package coupon modified/);
__PACKAGE__->set_primary_key('id');
#__PACKAGE__->might_have(coupon => CatMgrDB::Coupon); #1 inflation fails with 
this
#__PACKAGE__->has_one( coupon => CatMgrDB::Coupon ); #2 fails with this too 
#__PACKAGE__->has_one( coupon => CatMgrDB::Coupon, 'listing'); #3 inflation 
works but I don't know why...? Is it interpreting that last 'listing' as a join 
condition?
__PACKAGE__->belongs_to( coupon => CatMgrDB::Coupon, 'coupon', 
{'cascade_delete' => 1} ); #4 inflation works
1;
[EMAIL PROTECTED] [/app/reltest]# cat CatMgrDB/Coupon.pm
package CatMgrDB::Coupon;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('coupon');
__PACKAGE__->add_columns(qw/id listing available flagged offer terms 
usermemo/); # and other columns
__PACKAGE__->set_primary_key('id');
__PACKAGE__->belongs_to( listing  => 'CatMgrDB::Listing', 'listing', {join_type 
=> 'left'});
1;

Here are the relevant bits of database:

desc listing (db is mysql)
| Field      | Type         | Null | Key | Default           | Extra          |
| coupon     | int(11)      |      |     | 0                 |                |

select id,name,coupon from listing where id=4499
id      name    coupon
4499    Telebody Inc.   36

select id,listing,offer from coupon where id=36
id      listing offer
36      4499    Free website estimate


       
____________________________________________________________________________________
Looking for a deal? Find great prices on flights and hotels with Yahoo! 
FareChase.
http://farechase.yahoo.com/

_______________________________________________
List: http://lists.rawmode.org/cgi-bin/mailman/listinfo/dbix-class
Wiki: http://dbix-class.shadowcatsystems.co.uk/
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/
Searchable Archive: http://www.mail-archive.com/[email protected]/

Reply via email to