[Dbix-class] Controlling column order
Will Hawes
info at whawes.co.uk
Thu Jan 12 11:33:56 CET 2006
Matt S Trout wrote:
> On Wed, Jan 11, 2006 at 01:16:12PM -0600, Brandon Black wrote:
>> On 1/11/06, Will Hawes <info at whawes.co.uk> wrote:
>>> Is it possible to control the order in which columns are returned from a
>>> DBIx::Class object?
>>>
>> You mean from DBIx::Class::Table->columns? Perhaps this should be an
>> optional column_info attribute (sort_order?) that ->columns looks at.
>
> or maybe just make the internal hash an IxHash like primaries do. Not sure
> what the performance impact of this would be though.
>
I thought something along the lines of the attached patch (to SVN
revision 462) might be useful here.
-------------- next part --------------
Index: Table.pm
===================================================================
--- Table.pm (revision 462)
+++ Table.pm (working copy)
@@ -10,10 +10,12 @@
use base qw/DBIx::Class/;
__PACKAGE__->load_components(qw/AccessorGroup/);
+__PACKAGE__->mk_classaccessor(qw/_ordered_columns/);
+
__PACKAGE__->mk_group_accessors('simple' =>
qw/_columns _primaries name resultset_class result_class schema/);
-=head1 NAME
+=head1 NAME
DBIx::Class::Table - Table object
@@ -21,7 +23,7 @@
=head1 DESCRIPTION
-This class is responsible for defining and doing table-level operations on
+This class is responsible for defining and doing table-level operations on
L<DBIx::Class> classes.
=head1 METHODS
@@ -33,6 +35,7 @@
$class = ref $class if ref $class;
my $new = bless({ %{$attrs || {}} }, $class);
$new->{resultset_class} ||= 'DBIx::Class::ResultSet';
+ $new->{_ordered_columns} ||= [];
$new->{_columns} ||= {};
$new->{name} ||= "!!NAME NOT SET!!";
return $new;
@@ -40,6 +43,9 @@
sub add_columns {
my ($self, @cols) = @_;
+ $self->_ordered_columns( \@cols )
+ if !$self->_ordered_columns;
+ push @{ $self->_ordered_columns }, @cols;
while (my $col = shift @cols) {
$self->_columns->{$col} = (ref $cols[0] ? shift : {});
}
@@ -69,27 +75,27 @@
return $self->resultset_class->new($self);
}
-=head2 has_column
-
- if ($obj->has_column($col)) { ... }
-
-Returns 1 if the table has a column of this name, 0 otherwise.
-
-=cut
+=head2 has_column
+ if ($obj->has_column($col)) { ... }
+
+Returns 1 if the table has a column of this name, 0 otherwise.
+
+=cut
+
sub has_column {
my ($self, $column) = @_;
return exists $self->_columns->{$column};
}
-=head2 column_info
-
- my $info = $obj->column_info($col);
-
+=head2 column_info
+
+ my $info = $obj->column_info($col);
+
Returns the column metadata hashref for a column.
-
-=cut
+=cut
+
sub column_info {
my ($self, $column) = @_;
croak "No such column $column" unless exists $self->_columns->{$column};
@@ -98,22 +104,27 @@
=head2 columns
- my @column_names = $obj->columns;
-
-=cut
+ my @column_names = $obj->columns;
+=cut
+
sub columns {
croak "columns() is a read-only accessor, did you mean add_columns()?" if (@_ > 1);
return keys %{shift->_columns};
}
-=head2 set_primary_key(@cols)
-
-Defines one or more columns as primary key for this table. Should be
+sub ordered_columns {
+ croak "ordered_columns() is a read-only accessor" if (@_ > 1);
+ return @{shift->_ordered_columns};
+}
+
+=head2 set_primary_key(@cols)
+
+Defines one or more columns as primary key for this table. Should be
called after C<add_columns>.
-
-=cut
+=cut
+
sub set_primary_key {
my ($self, @cols) = @_;
# check if primary key columns are valid columns
@@ -124,12 +135,12 @@
$self->_primaries(\@cols);
}
-=head2 primary_columns
-
+=head2 primary_columns
+
Read-only accessor which returns the list of primary keys.
-
-=cut
+=cut
+
sub primary_columns {
return @{shift->_primaries||[]};
}
More information about the Dbix-class
mailing list