update docs for count() with GROUP BY
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / PK.pm
CommitLineData
dbd7896f 1package DBIx::Class::PK;
2
3use strict;
4use warnings;
5
1edd1722 6use base qw/DBIx::Class::Row/;
dbd7896f 7
34d52be2 8=head1 NAME
9
10DBIx::Class::PK - Primary Key class
11
12=head1 SYNOPSIS
13
14=head1 DESCRIPTION
15
8091aa91 16This class contains methods for handling primary keys and methods
17depending on them.
34d52be2 18
19=head1 METHODS
20
34d52be2 21=cut
22
dbd7896f 23sub _ident_cond {
24 my ($class) = @_;
d7156e50 25 return join(" AND ", map { "$_ = ?" } $class->primary_columns);
dbd7896f 26}
27
28sub _ident_values {
29 my ($self) = @_;
d7156e50 30 return (map { $self->{_column_data}{$_} } $self->primary_columns);
dbd7896f 31}
32
8091aa91 33=head2 discard_changes
076652e8 34
8091aa91 35Re-selects the row from the database, losing any changes that had
36been made.
076652e8 37
38=cut
39
510ca912 40sub discard_changes {
41 my ($self) = @_;
42 delete $self->{_dirty_columns};
8d5134b0 43 return unless $self->in_storage; # Don't reload if we aren't real!
741d6d0e 44 my ($reload) = $self->find(map { $self->$_ } $self->primary_columns);
c1d23573 45 unless ($reload) { # If we got deleted in the mean-time
8d5134b0 46 $self->in_storage(0);
c1d23573 47 return $self;
48 }
4a07648a 49 delete @{$self}{keys %$self};
50 @{$self}{keys %$reload} = values %$reload;
c1d23573 51 return $self;
510ca912 52}
53
8091aa91 54=head2 id
076652e8 55
8091aa91 56Returns the primary key(s) for a row. Can't be called as
076652e8 57a class method.
58
59=cut
60
604d9f38 61sub id {
62 my ($self) = @_;
701da8c4 63 $self->throw_exception( "Can't call id() as a class method" ) unless ref $self;
604d9f38 64 my @pk = $self->_ident_values;
65 return (wantarray ? @pk : $pk[0]);
66}
67
8091aa91 68=head2 ID
69
70Returns a unique id string identifying a row object by primary key.
71Used by L<DBIx::Class::CDBICompat::LiveObjectIndex> and
72L<DBIx::Class::ObjectCache>.
73
74=cut
75
48700d09 76sub ID {
77 my ($self) = @_;
701da8c4 78 $self->throw_exception( "Can't call ID() as a class method" ) unless ref $self;
48700d09 79 return undef unless $self->in_storage;
d7156e50 80 return $self->_create_ID(map { $_ => $self->{_column_data}{$_} } $self->primary_columns);
48700d09 81}
82
83sub _create_ID {
84 my ($class,%vals) = @_;
90f3f5ff 85 return undef unless 0 == grep { !defined } values %vals;
48700d09 86 $class = ref $class || $class;
87 return join '|', $class, map { $_ . '=' . $vals{$_} } sort keys %vals;
88}
89
103647d5 90sub ident_condition {
fea3d045 91 my ($self, $alias) = @_;
103647d5 92 my %cond;
fea3d045 93 $cond{(defined $alias ? "${alias}.$_" : $_)} = $self->get_column($_) for $self->primary_columns;
103647d5 94 return \%cond;
95}
96
dbd7896f 971;
34d52be2 98
34d52be2 99=head1 AUTHORS
100
daec44b8 101Matt S. Trout <mst@shadowcatsystems.co.uk>
34d52be2 102
103=head1 LICENSE
104
105You may distribute this code under the same terms as Perl itself.
106
107=cut
108