[Catalyst] DBIx::Class and Catalyst - Trying to make sense of it all.

Matt S Trout dbix-class at trout.me.uk
Mon Sep 29 17:05:05 BST 2008


On Sun, Sep 28, 2008 at 10:15:25AM -0400, Leanan Sidhe wrote:
> First, I apologize for the completely noob tone of this email.  I've read
> through the perl docs for DBIx::Class, and various Catalyst parts, but I'm
> having problems understanding how DBIx::Class stuff is slightly different in
> Catalyst.
> 
> For example, in the DBI docs, I constantly see the following:
> 
> $schema->resultset('table_name')->search(....);

No you don't.

The argument to resultset is the source name, which is by default the last
part of the class name.

So for My::Schema::Foo, it'd be $schema->resultset('Foo'), the table name
could be 'tbl_foobar_baz' or whatever for all DBIx::Class cares so long as
you pass that to ->table.

> in Catalyst, this seems to be
> $c->model('table_model_package')->search(....);

No. Basically for each valid argument to $schema->resultset,
Catalyst::Model::DBIC::Schema sets it up so that

$c->model('NameOfModel::${arg_to_resultset}') is a shortcut to
$c->model('NameOfModel')->schema->resultset($arg_to_resultset).

> I get that and it's not too rough.
> 
> But then where I get hung up is that I have a few table relationships I want
> to query.  Say I have the following tables / relationships:
> 
> users:
>   user_id
>   user_name
>   pass
> 
> cards:
>   card_id
>   card_name
>   card_description
>   set_id
> 
> sets:
>   set_id
>   set_name
> 
> user_cards:
>   id
>   user_id
>   card_id
> 
> A card has a set
> A set has many cards
> A card has many user_cards
> A user_card has a user
> A user_card has a card
> 
> Now, say I want to have a page that lists out all the cards a user has.
> Right now I have one user, so I'm not doing much on the user id.  Ok, that's
> simple, I just do:
> 
> my $user_cards = $c->model('Model::for::UserCards');
> my $cards = $user_cards->search_related('cards');

That's completely wrong.

What you want is:

my $user = $c->model('ModelName::User')->find($user_id);

my $cards = $user->cards;

If you're using Catalyst::Authentication::Store::DBIx::Class you can do

my $user = $c->user->obj;

to get the DBIC object for the user.

If you want more information on using DBIx::Class, please post to the
DBIx::Class list - the $c->model shortcut for $schema->resultset is the
-only- thing that's different between normal DBIC usage and DBIC under
Catalyst, and that's not so much a difference as an extra handy feature :)

-- 
      Matt S Trout       Need help with your Catalyst or DBIx::Class project?
   Technical Director                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://chainsawblues.vox.com/            http://www.shadowcat.co.uk/servers/



More information about the Catalyst mailing list