DBICでbelongs_toからmight_have,has_oneへ変更でInvalid rel cond key
DBICのリレーションでエラーが出た部分について。
perlのあるテーブルのリレーションをbelongs_to から might_haveにすることにしました。
Catalyst エラーがでました。
Invalid rel cond key date at
無効なキー???
どうやらDBIx::Class::Relationshipのコード以下の部分でエラーになったみたいです。
正規表現でforeignとselfをチェックしていました。
以下のような変更で正常になりました。
どうやらmight_have,has_oneでは、必ず「 foreign 」と「 self 」がないとダメみたいですね。
perlのあるテーブルのリレーションをbelongs_to から might_haveにすることにしました。
#変更前 __PACKAGE__->belongs_to( 'item' => 'Test::Schema::Item', { 'item_id' => 'item_id' , 'date' => 'date } ); #変更後 __PACKAGE__->might_have( 'item' => 'Test::Schema::Item', { 'item_id' => 'item_id' , 'date' => 'date } );
Catalyst エラーがでました。
Invalid rel cond key date at
無効なキー???
どうやらDBIx::Class::Relationshipのコード以下の部分でエラーになったみたいです。
正規表現でforeignとselfをチェックしていました。
sub resolve_condition { my ($self, $cond, $rel, $for) = @_; #warn %$cond; if (ref $cond eq 'HASH') { my %ret; while (my ($k, $v) = each %{$cond}) { # XXX should probably check these are valid columns $k =~ s/^foreign\.// || $self->throw_exception("Invalid rel cond key ${k}"); $v =~ s/^self\.// || $self->throw_exception("Invalid rel cond val ${v}"); if (ref $for) { # Object #warn "$self $k $for $v"; $ret{$k} = $for->get_column($v); #warn %ret; } else { $ret{"${rel}.${k}"} = "${for}.${v}"; } } return \%ret; } elsif (ref $cond eq 'ARRAY') { return [ map { $self->resolve_condition($_, $rel, $for) } @$cond ]; } else { die("Can't handle this yet :("); } }リレーションで第二引数として渡していたハッシュでのキーがエラーの原因でした。
以下のような変更で正常になりました。
#変更前 __PACKAGE__->belongs_to( 'item' => 'Test::Schema::Item', { 'item_id' => 'item_id' , 'date' => 'date } ); #変更後(正しい) __PACKAGE__->might_have( 'item' => 'Test::Schema::Item', { 'foreign.item_id' => 'self.item_id' , 'foreign.date' => 'self.date' } );
どうやらmight_have,has_oneでは、必ず「 foreign 」と「 self 」がないとダメみたいですね。