DBIx-Class-ResultDDL
view release on metacpan or search on metacpan
lib/DBIx/Class/ResultDDL/V1.pm view on Meta::CPAN
package DBIx::Class::ResultDDL::V1;
use DBIx::Class::ResultDDL -exporter_setup => 1;
use Carp;
# ABSTRACT: Back-compat for version 0 of this module
my @V1= qw(
table view
col
null default auto_inc fk
integer unsigned tinyint smallint bigint decimal numeric money
float float4 float8 double real
char varchar nchar nvarchar MAX binary varbinary bit varbit
blob tinyblob mediumblob longblob text tinytext mediumtext longtext ntext bytea
date datetime timestamp enum bool boolean
uuid json jsonb inflate_json array
primary_key idx create_index unique sqlt_add_index sqlt_add_constraint
rel_one rel_many has_one might_have has_many belongs_to many_to_many
ddl_cascade dbic_cascade
);
our %EXPORT_TAGS;
$EXPORT_TAGS{V1}= \@V1;
export @V1;
*_maybe_timezone= *DBIx::Class::ResultDDL::_maybe_timezone;
*_maybe_array= *DBIx::Class::ResultDDL::_maybe_array;
sub datetime { my $tz= &_maybe_timezone; data_type => 'datetime'.&_maybe_array, ($tz? (time_zone => $tz) : ()), @_ }
sub timestamp { my $tz= &_maybe_timezone; data_type => 'timestamp'.&_maybe_array,($tz? (time_zone => $tz) : ()), @_ }
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
DBIx::Class::ResultDDL::V1 - Back-compat for version 0 of this module
=head1 DESCRIPTION
This package provides the ":V1" API functions, for backward compatibility.
It is always best to upgrade your code to the latest API version, resolving any
conflicts that might arise, but this provides stability for old code.
=head1 EXPORTED FUNCTIONS
=head2 table
table 'foo';
# becomes...
__PACKAGE__->table('foo');
=head2 col
col $name, @options;
# becomes...
__PACKAGE__->add_column($name, { is_nullable => 0, @merged_options });
Define a column. This calls add_column after sensibly merging all your options.
It defaults the column to not-null for you, but you can override that by saying
C<null> in your options.
You will probably use many of the methods below to build the options for the column:
=head3 null
is_nullable => 1
=head3 auto_inc
is_auto_increment => 1, 'extra.auto_increment_type' => 'monotonic'
(The 'monotonic' bit is required to correctly deploy on SQLite. You can read the
lib/DBIx/Class/ResultDDL/V1.pm view on Meta::CPAN
=head2 belongs_to
belongs_to $rel_name, $peer_class, $condition, @attr_list;
belongs_to $rel_name, { colname => "$ResultClass.$colname" }, @attr_list;
# becomes...
__PACKAGE__->belongs_to($rel_name, $peer_class, $condition, { @attr_list });
Note that the normal DBIC belongs_to requires conditions to be of the form
{ "foreign.$their_col" => "self.$my_col" }
but all these sugar functions allow it to be written the other way around, and use a
Result Class name in place of "foreign.". The Result Class may be a fully qualified
package name, or just the final component if it is in the same parent package namespace
as the current package.
=head2 might_have
might_have $rel_name, $peer_class, $condition, @attr_list;
might_have $rel_name, { colname => "$ResultClass.$colname" }, @attr_list;
# becomes...
__PACKAGE__->might_have($rel_name, $peer_class, $condition, { @attr_list });
=head2 has_one
has_one $rel_name, $peer_class, $condition, @attr_list;
has_one $rel_name, { colname => "$ResultClass.$colname" }, @attr_list;
# becomes...
__PACKAGE__->has_one($rel_name, $peer_class, $condition, { @attr_list });
=head2 has_many
has_many $rel_name, $peer_class, $condition, @attr_list;
has_many $rel_name, { colname => "$ResultClass.$colname" }, @attr_list;
# becomes...
__PACKAGE__->has_many($rel_name, $peer_class, $condition, { @attr_list });
=head2 many_to_many
many_to_many $name => $rel_to_linktable, $rel_from_linktable;
# becomes...
__PACKAGE__->many_to_many(@_);
=head2 rel_one
Declares a single-record left-join relation B<without implying ownership>.
Note that the DBIC relations that do imply ownership like C<might_have> I<cause an implied
deletion of the related row> if you delete a row from this table that references it, even if
your schema did not have a cascading foreign key. This DBIC feature is controlled by the
C<cascading_delete> option, and using this sugar function to set up the relation defaults that
feature to "off".
rel_one $rel_name, $peer_class, $condition, @attr_list;
rel_one $rel_name, { $mycol => "$ResultClass.$fcol", ... }, @attr_list;
# becomes...
__PACKAGE__->add_relationship(
$rel_name, $peer_class, { "foreign.$fcol" => "self.$mycol" },
{
join_type => 'LEFT',
accessor => 'single',
cascade_copy => 0,
cascade_delete => 0,
is_depends_on => $is_f_pk, # auto-detected, unless specified
($is_f_pk? fk_columns => { $mycol => 1 } : ()),
@attr_list
}
);
=head2 rel_many
rel_many $name => { $my_col => "$class.$col", ... }, @options;
Same as L</rel_one>, but generates a one-to-many relation with a multi-accessor.
=head2 ddl_cascade
ddl_cascade; # same as ddl_cascade("CASCADE");
ddl_cascade(1); # same as ddl_cascade("CASCADE");
ddl_cascade(0); # same as ddl_cascade("RESTRICT");
ddl_cascade($mode);
Helper method to generate C<@options> for above. It generates
on_update => $mode, on_delete => $mode
This does not affect client-side cascade, and is only used by Schema::Loader to generate DDL
for the foreign keys when the table is deployed.
=head2 dbic_cascade
dbic_cascade; # same as dbic_cascade(1)
dbic_cascade($enabled);
Helper method to generate C<@options> for above. It generates
cascade_copy => $enabled, cascade_delete => $enabled
This re-enables the dbic-side cascading that was disabled by default in the C<rel_> functions.
=head2 view
view $view_name, $view_sql, %options;
Makes the current resultsource into a view. This is used instead of
'table'. Takes two options, 'is_virtual', to make this into a
virtual view, and 'depends' to list tables this view depends on.
Is the equivalent of
__PACKAGE__->table_class('DBIx::Class::ResultSource::View');
__PACKAGE__->table($view_name);
__PACKAGE__->result_source_instance->view_definition($view_sql);
__PACKAGE__->result_source_instance->deploy_depends_on($options{depends});
__PACKAGE__->result_source_instance->is_virtual($options{is_virtual});
=head1 INDEXES AND CONSTRAINTS
DBIx::Class doesn't actually track the indexes or constraints on a table. If you want to add
these to be automatically deployed with your schema, you need an C<sqlt_deploy_hook> function.
This module can create one for you, but does not yet attempt to wrap one that you provide.
(You can of course wrap the one generated by this module using a method modifier from
L<Class::Method::Modifiers>)
The method C<sqlt_deploy_hook> is created in the current package the first time one of these
functions are called. If it already exists and wasn't created by DBIx::Class::ResultDDL, it
will throw an exception. The generated method does call C<maybe::next::method> for you.
=head2 sqlt_add_index
This is a direct passthrough to the function L<SQL::Translator::Schema::Table/add_index>,
without any magic.
See notes above about the generated C<sqlt_deploy_hook>.
=head2 sqlt_add_constraint
This is a direct passthrough to the function L<SQL::Translator::Schema::Table/add_constraint>,
without any magic.
See notes above about the generated C<sqlt_deploy_hook>.
=head2 create_index
create_index $index_name => \@fields, %options;
This is sugar for sqlt_add_index. It translates to
sqlt_add_index( name => $index_name, fields => \@fields, options => \%options, (type => ?) );
where the C<%options> are the L<SQL::Translator::Schema::Index/options>, except if
one of the keys is C<type>, then that key/value gets pulled out and used as
L<SQL::Translator::Schema::Index/type>.
=head2 idx
Alias for L</create_index>; lines up nicely with 'col'.
( run in 0.533 second using v1.01-cache-2.11-cpan-5a3173703d6 )