[Dbix-class] DBIC hits DB thoguh using prefetch (repost)

Moritz Onken onken at houseofdesign.de
Thu Jul 17 08:51:41 BST 2008


Hi,

yes it is possible to have multiple parents and childs. I'm not using  
the
many_to_many helper and even a $rs->parents->first->parent results in  
a db
hit. Seems like DBIC doesn't recognize that everything it needs is  
already
there.

I have no idea where to look at in the dbic code to find this bug (if  
it is one)


cheers,

moritz

Am 16.07.2008 um 20:45 schrieb Hartmaier Alexander:

> Hi Moritz!
>
> You have to use the rels the same way to prefetch them, without  
> using the many_to_many helper (which I can't see in your code).
> Imho the ->all is the problem.
> But why have the MapCategories table at all?
> Just store the parent or child in your Categories table!
> Or is it really possible to have multiple parents and childs?
>
> -Alex
>
>
> -----Original Message-----
> From: Moritz Onken [mailto:onken at houseofdesign.de]
> Sent: Tuesday, July 08, 2008 9:48 AM
> To: DBIx::Class user and developer list
> Subject: [Dbix-class] DBIC hits DB thoguh using prefetch (repost)
>
> Hi,
>
> sorry for the repost, but there was no answer to my previous post.
>
> I have a table 'categories' which has a many_to_many relationship to
> itself using a table 'map_categories'.
>
> I found out that prefetching a many_to_many rel does not work. So I
> prefetched the has_many rel to 'map_categories' (parents) and prefetch
> the belongs_to rel (parent) from 'map_categories' to  
> 'categories' ($rs-
>> search({},{prefetch => {'parents' => 'parent'}})->all). This does
> the sql statement I expect but when I call $row->parents->all (or $rs-
> first->parents->first->parent) on a row of this rs it hits the
> database again. Although the resultset already contains all rows it
> needs.
>
> Any ideas what I did wrong?
>
> cheers,
>
> moritz
>
> package Schema::Categories;
>
> use strict;
> use warnings;
>
> use base 'DBIx::Class';
>
> __PACKAGE__->load_components("PK::Auto", "Core");
> __PACKAGE__->table("categories");
> __PACKAGE__->add_columns(
>  "title",
>  {
>    data_type => "character varying",
>    default_value => undef,
>    is_nullable => 1,
>    size => 100,
>  },
>  "id",
>  {
>    data_type => "integer",
>    is_nullable => 0
>  });
>
> __PACKAGE__->set_primary_key("id");
>
> __PACKAGE__->has_many("parents" => 'Schema::MapCategories' =>  
> "child");
>
>
> 1;
>
> package Schema::MapCategories;
>
> use strict;
> use warnings;
>
> use base 'DBIx::Class';
>
> __PACKAGE__->load_components("PK::Auto", "Core");
> __PACKAGE__->table("map_categories");
> __PACKAGE__->add_columns(
>  "child",
>  {
>    data_type => "integer",
>    is_nullable => 0,
>  },
>  "parent",
>  {
>    data_type => "integer",
>    is_nullable => 0
>  });
>
> __PACKAGE__->belongs_to("child" => "Schema::Categories", "child");
> __PACKAGE__->belongs_to("parent" => "Schema::Categories", "parent");
> __PACKAGE__->add_unique_constraint([ qw/child parent/ ]);
>
>
> 1;
>
> _______________________________________________
> 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/dbix-class@lists.rawmode.org
>
>
> *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*
> T-Systems Austria GesmbH   Rennweg 97-99, 1030 Wien
> Handelsgericht Wien, FN 79340b
> *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*
> Notice: This e-mail contains information that is confidential and  
> may be privileged.
> If you are not the intended recipient, please notify the sender and  
> then
> delete this e-mail immediately.
> *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*
>
>
> _______________________________________________
> 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/dbix-class@lists.rawmode.org




More information about the DBIx-Class mailing list