Data-MuForm-Model-DBIC
view release on metacpan or search on metacpan
lib/Data/MuForm/Role/Model/DBIC.pm view on Meta::CPAN
package Data::MuForm::Role::Model::DBIC;
# ABSTRACT: model role that interfaces with DBIx::Class
use Moo::Role;
use Carp;
use DBIx::Class::ResultClass::HashRefInflator;
use DBIx::Class::ResultSet::RecursiveUpdate;
use Scalar::Util ('blessed');
use Types::Standard -types;
has 'schema' => ( is => 'rw', );
has unique_constraints => (
is => 'ro',
isa => ArrayRef,
lazy => 1,
builder => '_build_unique_constraints',
);
sub _build_unique_constraints {
my $self = shift;
return [ grep { $_ ne 'primary' }
$self->resultset->result_source->unique_constraint_names ];
}
has unique_messages => (
is => 'ro',
isa => HashRef,
default => sub { +{} },
);
sub use_model_for_defaults {
my $self = shift;
return ( $self->model && $self->model->in_storage ? 1 : 0 );
}
sub validate_model {
my ($self) = @_;
return unless $self->validate_unique;
return 1;
}
sub clear_model {
my $self = shift;
$self->model(undef);
$self->model_id(undef);
}
sub update_model {
my $self = shift;
my $model = $self->model;
my $source = $self->source;
my %update_params = (
resultset => $self->resultset,
updates => $self->values,
unknown_params_ok => 1,
);
$update_params{object} = $self->model if $self->model;
my $new_model;
# perform update in a transaction, since RecursiveUpdate may do multiple
# updates if there are compound or multiple fields
$self->schema->txn_do(
sub {
$new_model = DBIx::Class::ResultSet::RecursiveUpdate::Functions::recursive_update(
%update_params);
$new_model->discard_changes;
}
);
$self->model($new_model) if $new_model;
return $self->model;
}
sub lookup_options {
my ( $self, $field, $accessor_path ) = @_;
return unless $self->schema;
my $self_source = $self->get_source($accessor_path);
my $accessor = $field->accessor;
# if this field doesn't refer to a foreign key, return
my $f_class;
my $source;
# belongs_to single select
if ( $self_source->has_relationship($accessor) ) {
$f_class = $self_source->related_class($accessor);
$source = $self->schema->source($f_class);
}
else {
# check for many_to_many multiple select
my $resultset = $self_source->resultset;
my $new_result = $resultset->new_result( {} );
if ( $new_result && $new_result->can("add_to_$accessor") ) {
$source = $new_result->$accessor->result_source;
}
}
return unless $source;
my $label_column = $field->label_column;
return
unless ( $source->has_column($label_column) ||
$source->result_class->can($label_column) );
my $active_col = $field->active_column;
( run in 3.615 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )