The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Persistence::Relationship::ManyToMany - Many to many relationship

CLASS HIERARCHY

 Persistence::Relationship
    |
    +----Persistence::Relationship::ManyToMany

SYNOPSIS

    use Persistence::Relationship::ManyToMany ':all';

#.... entities definition

    my $entity_manager = Persistence::Entity::Manager->new(name => 'my_manager', connection_name => 'test');

    my $emp_project_entity = Persistence::Entity->new(
        name    => 'emp_project',
        alias   => 'ep',
        primary_key => ['projno', 'empno'],
        columns => [
            sql_column(name => 'projno'),
            sql_column(name => 'empno'),
            sql_column(name => 'leader'),
        ],
    );

    my $emp_entity = Persistence::Entity->new(
        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,
    );

DESCRIPTION

Represents many to many relationship. Supports eager, lazy fetch, cascading operation (inert/update/delete).

EXPORT

many_to_many by ':all' tag.

ATTRIBUTES

join_entity_name

Join entity name.

METHODS

many_to_many
deserialise_attribute

Deserialises relation attribute

insert

Inserts relationship data.

merge

Merges relationship data.

delete

Deletes many to many association.

_associate_relationship_data

SEE ALSO

Persistence::Relationship Persistence::Entity Persistence::Entity::Manager Persistence::ORM

COPYRIGHT AND LICENSE

The Persistence::ManyToManyRelationship module is free software. You may distribute under the terms of either the GNU General Public License or the Artistic License, as specified in the Perl README file.

AUTHOR

Adrian Witas, adrian@webapp.strefa.pl