| DBIx-DBO documentation | Contained in the DBIx-DBO distribution. |
DBIx::DBO::Table - An OO interface to SQL queries and results. Encapsulates a table in an object.
# Create a Table object
my $table = $dbo->table('my_table');
# Get a column reference
my $column = $table ** 'employee_id';
# Quickly display my employee id
print $table->fetch_value('employee_id', name => 'Vernon');
# Find the IDs of fired employees
my @fired = @{ $table->fetch_column('id', status => 'fired');
# Insert a new row into the table
$table->insert(employee_id => 007, name => 'James Bond');
# Remove rows from the table where the name IS NULL
$table->delete(name => undef);
Table objects are mostly used for column references in a Query.
They can also be used for INSERTs, DELETEs and simple lookups (fetch_*).
newDBIx::DBO::Table->new($dbo, $table); DBIx::DBO::Table->new($dbo, [$schema, $table]); DBIx::DBO::Table->new($dbo, $table_object);
Create and return a new Table object.
Tables can be specified by their name or an arrayref of schema and table name or another Table object.
tablesReturn a list of Table objects, which will always be this Table object.
columnsReturn a list of column names.
column$table->column($column_name); $table ** $column_name;
Returns a reference to a column for use with other methods.
The ** method is a shortcut for the column method.
rowReturns a new Row object for this table.
fetch_row$table->fetch_row(%where);
Fetch the first matching row from the table returning it as a Row object.
The %where is a hash of field/value pairs. The value can be a SCALAR ref, which will be used without quoting.
$someone = $table->fetch_row(name => \'NOT NULL', age => 21, join_date => \'CURDATE()', end_date => undef);
fetch_value$table->fetch_value($column, %where);
Fetch the first matching row from the table returning the value in one column.
fetch_hash$table->fetch_hash(%where);
Fetch the first matching row from the table returning it as a hashref.
fetch_column$table->fetch_column($column, %where);
Fetch all matching rows from the table returning an arrayref of the values in one column.
insert$table->insert(name => 'Richard', age => 103);
Insert a row into the table. Returns true on success or undef on failure.
On supporting databases you may also use $table->last_insert_id to retreive
the autogenerated ID (if there was one) from the last inserted row.
last_insert_id$table->insert(name => 'Quentin'); my $row_id = $table->last_insert_id;
Retreive the autogenerated ID (if there was one) from the last inserted row.
Returns the ID or undef if it's unavailable.
delete$table->delete(name => 'Richard', age => 103);
Delete all rows from the table matching the criteria. Returns the number of rows deleted or undef on failure.
truncate$table->truncate;
Truncate the table. Returns true on success or undef on failure.
These methods are accessible from all DBIx::DBO* objects.
dbhThe read-write DBI handle.
rdbhThe read-only DBI handle, or if there is no read-only connection, the read-write DBI handle.
do$table->do($statement) or die $table->dbh->errstr; $table->do($statement, \%attr) or die $table->dbh->errstr; $table->do($statement, \%attr, @bind_values) or die ...
This provides access to DBI->do method. It defaults to using the read-write DBI handle.
config$table_setting = $table->config($option); $table->config($option => $table_setting);
Get or set the Table config settings. When setting an option, the previous value is returned. When getting an option's value, if the value is undefined, the DBIx::DBO's value is returned.
| DBIx-DBO documentation | Contained in the DBIx-DBO distribution. |
package DBIx::DBO::Table; use strict; use warnings; use DBIx::DBO::Common; use Carp 'croak'; our @ISA = qw(DBIx::DBO::Common); use overload '**' => \&column, fallback => 1;
sub new { my $proto = shift; UNIVERSAL::isa($_[0], 'DBIx::DBO') or croak 'Invalid DBO Object'; my $class = ref($proto) || $proto; $class = $class->_set_dbd_inheritance($_[0]{dbd}); $class->_init(@_); } sub _init { my ($class, $dbo, $table) = @_; (my $schema, $table, my $me) = $dbo->table_info($table) or croak 'No such table: '.$table; bless { %$me, Schema => $schema, Name => $table, DBO => $dbo, LastInsertID => undef }, $class; }
sub tables { wantarray ? $_[0] : 1; } sub _table_alias { return if $_[0] == $_[1]; croak 'The table is not in this query'; } sub _quoted_name { my $me = shift; defined $me->{_quoted_name} ? $me->{_quoted_name} : ($me->{_quoted_name} = $me->_qi(@$me{qw(Schema Name)})); }
sub columns { @{$_[0]->{Columns}}; }
sub column { my ($me, $col) = @_; croak 'Invalid column '.$me->_qi($col).' in table '.$me->_quoted_name unless exists $me->{Column_Idx}{$col}; $me->{Column}{$col} ||= bless [$me, $col], 'DBIx::DBO::Column'; } sub _valid_col { my ($me, $col) = @_; return $col if $col->[0] == $me; }
sub row { my $me = shift; $me->_row_class->new($me->{DBO}, $me); }
sub fetch_row { my $me = shift; $me->row->load(@_); }
sub fetch_value { my ($me, $col) = splice @_, 0, 2; $col = $me->_parse_col($col); my $sql = 'SELECT '.$me->_qi($col->[1]).' FROM '.$me->_quoted_name; my @bind; $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_); $me->_sql($sql, @bind); my $ref = $me->rdbh->selectrow_arrayref($sql, undef, @bind); return $ref && $ref->[0]; }
sub fetch_hash { my $me = shift; my $sql = 'SELECT * FROM '.$me->_quoted_name; my @bind; $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_); $me->_sql($sql, @bind); $me->rdbh->selectrow_hashref($sql, undef, @bind); }
sub fetch_column { my ($me, $col) = splice @_, 0, 2; $col = $me->_parse_col($col); my $sql = 'SELECT '.$me->_qi($col->[1]).' FROM '.$me->_quoted_name; my @bind; $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_); $me->_sql($sql, @bind); return $me->rdbh->selectcol_arrayref($sql, undef, @bind); }
sub insert { my $me = shift; croak 'Called insert() without args on table '.$me->_quoted_name unless @_; croak 'Wrong number of arguments' if @_ & 1; my @cols; my @vals; my @bind; while (my ($col, $val) = splice @_, 0, 2) { push @cols, $me->_build_col($me->_parse_col($col)); push @vals, $me->_build_val(\@bind, $me->_parse_val($val)); } my $sql = 'INSERT INTO '.$me->_quoted_name.' ('.join(', ', @cols).') VALUES ('.join(', ', @vals).')'; $me->_sql($sql, @bind); my $sth = $me->dbh->prepare($sql) or return undef; my $rv = $sth->execute(@bind) or return undef; $me->{LastInsertID} = $me->_save_last_insert_id($sth); return $rv; } sub _save_last_insert_id { # Should be provided in a DBD specific method # It is called after insert and must return the autogenerated ID # my $me = shift; # my $sth = shift; # return $sth->{Database}->last_insert_id(undef, @$me{qw(Schema Name)}, undef); }
sub last_insert_id { my $me = shift; $me->{LastInsertID}; }
sub delete { my $me = shift; my $sql = 'DELETE FROM '.$me->_quoted_name; my @bind; $sql .= ' WHERE '.$_ if $_ = $me->_build_quick_where(\@bind, @_); $me->do($sql, undef, @bind); }
sub truncate { my $me = shift; $me->do('TRUNCATE TABLE '.$me->_quoted_name); }
sub config { my $me = shift; my $opt = shift; return $me->_set_config($me->{Config} ||= {}, $opt, shift) if @_; return defined $me->{Config}{$opt} ? $me->{Config}{$opt} : $me->{DBO}->config($opt); } sub DESTROY { undef %{$_[0]}; } 1; __END__