[Dbix-class] DBIx::Class many_to_many problems
Shawn Marincas
shawngmarincas at gmail.com
Sat Jul 11 20:15:22 GMT 2009
Hello, I'm having a trouble accessing resultsets through a many-to-many
relationship defined by my schema. I have a products table and a categories
table that are related many-to-many so that products can be in multiple
categories. This is the example they give in the
DBIx::Class::Manual::Cookbook for a straightforward configuration using
ManyToMany is:
package My::User;
use base 'DBIx::Class';
__PACKAGE__->load_components('Core');
__PACKAGE__->table('user');
__PACKAGE__->add_columns(qw/id name/);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->has_many('user_address' =3D> 'My::UserAddress', 'user');
__PACKAGE__->many_to_many('addresses' =3D> 'user_address', 'address');
package My::UserAddress;
use base 'DBIx::Class';
__PACKAGE__->load_components('Core');
__PACKAGE__->table('user_address');
__PACKAGE__->add_columns(qw/user address/);
__PACKAGE__->set_primary_key(qw/user address/);
__PACKAGE__->belongs_to('user' =3D> 'My::User');
__PACKAGE__->belongs_to('address' =3D> 'My::Address');
package My::Address;
use base 'DBIx::Class';
__PACKAGE__->load_components('Core');
__PACKAGE__->table('address');
__PACKAGE__->add_columns(qw/id street town area_code country/);
__PACKAGE__->set_primary_key('id');
__PACKAGE__->has_many('user_address' =3D> 'My::UserAddress', 'address');
__PACKAGE__->many_to_many('users' =3D> 'user_address', 'user');
$rs =3D $user->addresses(); # get all addresses for a user
$rs =3D $address->users(); # get all users for an address
Here is my configuration:
package MyAppDB::Product;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('Products');
__PACKAGE__->add_columns(qw/product_id name sku vendor_id price height width
depth diameter color weight description info img_thumb img_large date_added
shipping availability is_favorite importance/);
__PACKAGE__->set_primary_key(qw/product_id/);
# Vendor relationship
__PACKAGE__->belongs_to(vendor =3D> 'MyAppDB::Vendor', 'vendor_id');
# Category many-to-many relationship
__PACKAGE__->has_many('product_categories' =3D>
'MyAppDB::ProductCategoryLink', 'product_id');
__PACKAGE__->many_to_many('categories' =3D> 'product_categories',
'category_id');
1;
package MyAppDB::ProductCategoryLink;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('ProductCategoryLink');
__PACKAGE__->add_columns(qw/product_id category_id/);
__PACKAGE__->set_primary_key(qw/product_id category_id/);
# belongs_to():
__PACKAGE__->belongs_to(product =3D> 'MyAppDB::Product', 'product_id');
# belongs_to():
__PACKAGE__->belongs_to(category =3D> 'MyAppDB::Category', 'category_id');
1;
package MyAppDB::Category;
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/PK::Auto Core/);
__PACKAGE__->table('Categories');
__PACKAGE__->add_columns(qw/category_id name/);
__PACKAGE__->set_primary_key(qw/category_id/);
# Category many-to-many relationship
__PACKAGE__->has_many('product_categories' =3D>
'MyAppDB::ProductCategoryLink', 'category_id');
__PACKAGE__->many_to_many('products' =3D> 'product_categories', 'product');
1;
In my Catalyst controller I try and access all the Products of a given
Category like so:
$c->stash->{products} =3D [$c->model('MyAppDB::Category')->search({
name =3D> $category })->products];
And receive the following error:
"Can't locate object method "products" via package "DBIx::Class::ResultSet"
I am using Catalyst 5.80007 on CentOS 5.0 x64 with MySQL 14.12... I have
setup the database tables with the InnoDB engine and setup the foreign keys
in the link table. I don't know what else I could be missing here... anyone
have ideas where I could be going wrong? I'm a relatively new user of both
Catalyst and DBIx::Class. Thanks so much.
- Shawn Marincas
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20090711/77e=
a77e7/attachment.htm
More information about the DBIx-Class
mailing list