X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FRelationship.pm;h=1106f28c8caecc3d392c4ee07c63066c8fbd5394;hb=78bab9cad621ac5e3d1d12b02c41d662dec7a22a;hp=3fef7a34b5aa4805a4565a6814d57a1a5ce6af32;hpb=b8e1e21f0fcd55e6e3ce987e57601b279a75b666;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Relationship.pm b/lib/DBIx/Class/Relationship.pm index 3fef7a3..1106f28 100644 --- a/lib/DBIx/Class/Relationship.pm +++ b/lib/DBIx/Class/Relationship.pm @@ -7,6 +7,24 @@ use base qw/Class::Data::Inheritable/; __PACKAGE__->mk_classdata('_relationships', { } ); +=head1 NAME + +DBIx::Class::Relationship - Inter-table relationships + +=head1 SYNOPSIS + +=head1 DESCRIPTION + +This class handles relationships between the tables in your database +model. It allows your to set up relationships, and to perform joins +on searches. + +=head1 METHODS + +=over 4 + +=cut + sub add_relationship { my ($class, $rel, $f_class, $cond, $attrs) = @_; my %rels = %{ $class->_relationships }; @@ -21,7 +39,7 @@ sub _cond_key { my $action = $attrs->{_action} || ''; if ($action eq 'convert') { unless ($key =~ s/^foreign\.//) { - die "Unable to convert relationship to WHERE clause: invalid key ${key}"; + $self->throw("Unable to convert relationship to WHERE clause: invalid key ${key}"); } return $key; } elsif ($action eq 'join') { @@ -29,8 +47,8 @@ sub _cond_key { if ($attrs->{_aliases}{$type}) { return join('.', $attrs->{_aliases}{$type}, $field); } else { - die "Unable to resolve type ${type}: only have aliases for ". - join(', ', keys %{$attrs->{_aliases}{$type} || {}}); + $self->throw( "Unable to resolve type ${type}: only have aliases for ". + join(', ', keys %{$attrs->{_aliases}{$type} || {}}) ); } } return $self->NEXT::ACTUAL::_cond_key($attrs, $key); @@ -41,10 +59,10 @@ sub _cond_value { my $action = $attrs->{_action} || ''; if ($action eq 'convert') { unless ($value =~ s/^self\.//) { - die "Unable to convert relationship to WHERE clause: invalid value ${value}"; + $self->throw( "Unable to convert relationship to WHERE clause: invalid value ${value}" ); } - unless ($self->can($value)) { - die "Unable to convert relationship to WHERE clause: no such accessor ${value}"; + unless ($self->_columns->{$value}) { + $self->throw( "Unable to convert relationship to WHERE clause: no such accessor ${value}" ); } push(@{$attrs->{bind}}, $self->get_column($value)); return '?'; @@ -53,8 +71,8 @@ sub _cond_value { if ($attrs->{_aliases}{$type}) { return join('.', $attrs->{_aliases}{$type}, $field); } else { - die "Unable to resolve type ${type}: only have aliases for ". - join(', ', keys %{$attrs->{_aliases}{$type} || {}}); + $self->throw( "Unable to resolve type ${type}: only have aliases for ". + join(', ', keys %{$attrs->{_aliases}{$type} || {}}) ); } } @@ -69,27 +87,30 @@ sub search_related { $attrs = { %{ pop(@_) } }; } my $rel_obj = $self->_relationships->{$rel}; - die "No such relationship ${rel}" unless $rel; - $attrs = { %{$rel_obj->{attrs}}, %{$attrs || {}} }; + $self->throw( "No such relationship ${rel}" ) unless $rel; + $attrs = { %{$rel_obj->{attrs} || {}}, %{$attrs || {}} }; my $s_cond; if (@_) { - die "Invalid query: @_" if (@_ > 1 && (@_ % 2 == 1)); + $self->throw( "Invalid query: @_" ) if (@_ > 1 && (@_ % 2 == 1)); my $query = ((@_ > 1) ? {@_} : shift); $s_cond = $self->_cond_resolve($query, $attrs); } $attrs->{_action} = 'convert'; my ($cond) = $self->_cond_resolve($rel_obj->{cond}, $attrs); $cond = "${s_cond} AND ${cond}" if $s_cond; - return $rel_obj->{class}->retrieve_from_sql($cond, @{$attrs->{bind} || {}}); + return $rel_obj->{class}->retrieve_from_sql($cond, @{$attrs->{bind} || []}, + $attrs); } sub create_related { my ($self, $rel, $values, $attrs) = @_; - die "Can't call create_related as class method" unless ref $self; - die "create_related needs a hash" unless (ref $values eq 'HASH'); + $self->throw( "Can't call create_related as class method" ) + unless ref $self; + $self->throw( "create_related needs a hash" ) + unless (ref $values eq 'HASH'); my $rel_obj = $self->_relationships->{$rel}; - die "No such relationship ${rel}" unless $rel; - die "Can't abstract implicit create for ${rel}, condition not a hash" + $self->throw( "No such relationship ${rel}" ) unless $rel; + $self->throw( "Can't abstract implicit create for ${rel}, condition not a hash" ) unless ref $rel_obj->{cond} eq 'HASH'; $attrs = { %{$rel_obj->{attrs}}, %{$attrs || {}}, _action => 'convert' }; my %fields = %$values; @@ -101,3 +122,16 @@ sub create_related { } 1; + +=back + +=head1 AUTHORS + +Matt S. Trout + +=head1 LICENSE + +You may distribute this code under the same terms as Perl itself. + +=cut +