[CDBI] has_many - how to specify link columns ?

Michael Reece mreece at vinq.com
Tue Aug 15 17:53:42 BST 2006


i think what you want is simply:

   articles->has_many( prices => 'prive2articles' => 'artid' );  #  
third argument is 'my key in foreign table'


this syntax ['price2articles' => 'artid'] is for 'mapping' across a  
many-to-many table.

(for example, if price2articles.price were (instead of a float) a key  
to another table (price), then you might:

   __PACKAGE__->has_many( prices => [ 'prices2articles' => 'price' ]  
=> 'artid' );

and that would automatically map the "price2articles->has_a 
(price=>'prices')" relationship, as though you had done this instead:

   __PACKAGE__->has_many( _article_prices => 'prices2articles' =>  
'artid' );
   sub prices {
     my $self = shift;
     return map $_->price, $self-> _article_prices;
   }
)

michael.

On Aug 15, 2006, at 2:22 AM, Andreas Grau wrote:

>
> I just can not figure out how to specify the column names when using
> has_many. I hope some kind soul can help me out.
>
> Say I have two tables:
>
> articles
>   id varchar(32) primary key
>   title varchar(255)
>   baseprice double
>
> price2articles
>   id varchar(32) primary key
>   artid varchar(32)
>   price double
>
> I need to link between articles.id and price2articles.artid - CDBI  
> seems to insist on using the same column names, 'id' in this case.
>
>
> So in package 'price2articles' I have
> __PACKAGE__->has_a( 'artid' => ['articles']); # this direction works
>
> But what to say in 'articles' ? I just can't seem to find to describe
> the relationship, and google fails on me as well. All tutorials happen
> to share the same id names and primary keys, which is not the case  
> here.
>
>
> __PACKAGE__->has_many( 'prices' => ['price2articles' => 'artid'],  
> 'id');
>
>
> And my driver:
>
> my $artlist = new articles->retrieve_all();
>
> while (my $article = $artlist->next) {
>
>     print $article->title . " " . $article->baseprice; # works
>
>     ## nothing here :-(
>     my @prices = $article->prices;
>     foreach(@prices) {
>         print " " . $_->price ;
>     }
>     print "\n";
>
> }
>
> This lists the articles, but nothing for the prices.
>
> Just for the records, I have the packages in different files, so the
> ordering problem described elsewhere should not be reason. The has_a
> works as well, I can 'go up' the relationship.
>
> I am pretty confident that this is simple as nothing, but I miserably
> fail to detect the flaw.
>
> Anybody ?
>
> Thanks a ton in advance,
> Andreas
>
> _______________________________________________
> ClassDBI mailing list
> ClassDBI at lists.digitalcraftsmen.net
> http://lists.digitalcraftsmen.net/mailman/listinfo/classdbi

---
michael reece :: software engineer :: mreece at vinq.com


-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.digitalcraftsmen.net/pipermail/classdbi/attachments/20060815/05fd34e5/attachment.htm


More information about the ClassDBI mailing list