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 )