Thank you kind sir, that worked spectacularly.

On Sat, Jul 11, 2009 at 2:31 PM, fREW Schmidt <[email protected]> wrote:

> On Sat, Jul 11, 2009 at 3:15 PM, Shawn Marincas 
> <[email protected]>wrote:
>
>> 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' => 'My::UserAddress', 'user');
>>   __PACKAGE__->many_to_many('addresses' => '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' => 'My::User');
>>   __PACKAGE__->belongs_to('address' => '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' => 'My::UserAddress', 'address');
>>   __PACKAGE__->many_to_many('users' => 'user_address', 'user');
>>
>>   $rs = $user->addresses(); # get all addresses for a user
>>
>>
>>
>>
>>
>>   $rs = $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 => 'MyAppDB::Vendor', 'vendor_id');
>>
>> # Category many-to-many relationship
>> __PACKAGE__->has_many('product_categories' =>
>> 'MyAppDB::ProductCategoryLink', 'product_id');
>> __PACKAGE__->many_to_many('categories' => '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 => 'MyAppDB::Product', 'product_id');
>>
>> # belongs_to():
>> __PACKAGE__->belongs_to(category => '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' =>
>> 'MyAppDB::ProductCategoryLink', 'category_id');
>> __PACKAGE__->many_to_many('products' => 'product_categories', 'product');
>>
>> 1;
>>
>>
>> In my Catalyst controller I try and access all the Products of a given
>> Category like so:
>>
>>        $c->stash->{products} = [$c->model('MyAppDB::Category')->search({
>> name => $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
>
>
> It's because you are doing a search, which returns a resultset, and you are
> using products, which would be chained off of the category class.  You
> probably want to do something like this:
>
>  $c->stash->{products} = [$c->model('MyAppDB::Category')->single({ name =>
> $category })->products];
>
> That will return the first (and presumably only) category that has the name
> you passed in.  If you do have more than one category with that name you
> will get an error.  In that case you could say first instead of single.
>
> HTH
> --
> fREW Schmidt
> http://blog.afoolishmanifesto.com
>
> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive:
> http://www.grokbase.com/group/[email protected]
>
_______________________________________________
List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
IRC: irc.perl.org#dbix-class
SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
Searchable Archive: http://www.grokbase.com/group/[email protected]

Reply via email to