[Dbix-class] Maybe a Regression? Without a primary key, prefetches
fail.
Peter Rabbitson
rabbit+dbic at rabbit.us
Wed Mar 24 11:41:10 GMT 2010
J. Shirley wrote:
> I'm not sure if this counts as a regression, but it was for me :)
>
> I have a class which is defined as:
>
> package MyApp::Schema::StupidJoinTable;
>
> use strict;
> use warnings;
>
> use base 'DBIx::Class';
>
> __PACKAGE__->load_components("Core");
>
> __PACKAGE__->table("stupid_join_table");
> __PACKAGE__->add_columns(
> "stupid_id",
> {
> data_type => "integer",
> default_value => undef,
> is_nullable => 0,
> size => 11
> },
> "stupider_id",
> {
> data_type => "integer",
> default_value => undef,
> is_nullable => 0,
> size => 11
> },
> );
>
> __PACKAGE__->belongs_to( 'thing_1', 'MyApp::Schema::Thing', 'stupid_id');
> __PACKAGE__->belongs_to( 'thing_2', 'MyApp::Schema::Thing2', 'stupider_id');
>
> 1;
>
>
> Now, if I attempt to prefetch this relationship, I get this error
> thrown (from DBIx/Class/Row.pm, line 1138):
> $class->throw_exception("Implicit prefetch (via select/columns)
> not supported with accessor 'multi'");
>
> The reason is that without ->set_primary_key(...) in this result
> definition, the query on type is an empty array.
>
> So, $prefetch->{$pre} is simply an empty array (the line "if (ref
> $prefetch->{$pre}[0] eq 'ARRAY')").
>
>
> This behavior is not changed if I explicitly define the columns on the
> relationships (eg., { 'foreign.stupid_id' => 'self.stupid_id' })
>
> I'm still running 0.08115 in production, so it is working there, but
> this came up on my tests as a failure. The fix for me is just adding
> in the primary keys as they should be, but it seemed like an odd
> behavior.
>
> If it's a bug, I'm happy to at least commit a failing test case :)
>
This will make the error more explicit:
http://dev.catalystframework.org/svnweb/bast/revision?rev=9044
In any case a failing test case is more than welcome, as the new code
has to be able to deal with such pk-less prefetches.
More information about the DBIx-Class
mailing list