Persistence-Entity
view release on metacpan or search on metacpan
lib/Persistence/Relationship/ManyToMany.pm view on Meta::CPAN
name => 'emp',
alias => 'ep',
primary_key => ['empno'],
columns => [
sql_column(name => 'empno'),
sql_column(name => 'ename', unique => 1),
sql_column(name => 'job'),
sql_column(name => 'deptno'),
],
value_generators => {empno => 'emp_gen'},
to_many_relationships => [
sql_relationship(target_entity => $emp_project_entity,
join_columns => ['empno'], order_by => 'empno, projno')
]
);
my $project_entity = Persistence::Entity->new(
name => 'project',
alias => 'pr',
primary_key => ['projno'],
columns => [
sql_column(name => 'projno'),
sql_column(name => 'name', unique => 1),
],
value_generators => {projno => 'project_gen'},
to_many_relationships => [
sql_relationship(target_entity => $emp_project_entity,
join_columns => ['projno'], order_by => 'projno, empno')
]
);
$entity_manager->add_entities($emp_project_entity, $emp_entity, $project_entity);
# object mapping
package Project;
use Abstract::Meta::Class ':all';
use Persistence::Entity ':all';
use Persistence::ORM ':all';
entity 'project';
column projno => has('$.id');
column name => has('$.name');
package Employee;
use Abstract::Meta::Class ':all';
use Persistence::Entity ':all';
use Persistence::ORM ':all';
entity 'emp';
column empno=> has('$.id');
column ename => has('$.name');
column job => has '$.job';
many_to_many 'project' => (
attribute => has('%.projects' => (associated_class => 'Project'), index_by => 'name'),
join_entity_name => 'emp_project',
fetch_method => LAZY,
cascade => ALL,
);
=head1 DESCRIPTION
Represents many to many relationship.
Supports eager, lazy fetch, cascading operation (inert/update/delete).
=head1 EXPORT
many_to_many by ':all' tag.
=head2 ATTRIBUTES
=over
=item join_entity_name
Join entity name.
=cut
has '$.join_entity_name' => (required => 1);
=back
=head2 METHODS
=over
=item many_to_many
=cut
sub many_to_many {
my $package = caller();
__PACKAGE__->add_relationship($package, @_);
}
=item deserialise_attribute
Deserialises relation attribute
=cut
sub deserialise_attribute {
my ($self, $object, $entity_manager, $orm) = @_;
my $entity = $entity_manager->entity($orm->entity_name);
my $target_entity = $entity_manager->entity($self->name)
or confess "cant find entity" . $self->name;
my $join_entity = $entity_manager->entity($self->join_entity_name);
my $relation = $entity->to_many_relationship($self->join_entity_name);
my %fields_values = $orm->column_values($object);
my %join_values = $entity->_join_columns_values($relation, \%fields_values);
return unless(map {$join_values{$_} ? ($_) : () } keys %join_values);
my $condition = SQL::Entity::Condition->struct_to_condition(map {$join_entity->column($_), $join_values{$_}} keys %join_values);
my $attribute = $self->attribute;
my @rows = $target_entity->find($attribute->associated_class, $condition);
if (@rows) {
( run in 1.065 second using v1.01-cache-2.11-cpan-39bf76dae61 )