DBIx::Class::Helper::Row::JoinTable(3)

NAME
DBIx::Class::Helper::Row::JoinTable - Easily set up join tables with DBIx::Class

SYNOPSIS
 package MyApp::Schema::Result::Foo_Bar;

 __PACKAGE__->load_components(qw{Helper::Row::JoinTable Core});

 __PACKAGE__->join_table({
    left_class   => 'Foo',
    left_method  => 'foo',
    right_class  => 'Bar',
    right_method => 'bar',
 });

 # the above is the same as:

 __PACKAGE__->table('Foo_Bar');
 __PACKAGE__->add_columns(
    foo_id => {
       data_type         => 'integer',
       is_nullable       => 0,
       is_numeric        => 1,
    },
    bar_id => {
       data_type         => 'integer',
       is_nullable       => 0,
       is_numeric        => 1,
    },
 );

 $self->set_primary_key(qw{foo_id bar_id});

 __PACKAGE__->belongs_to( foo => 'MyApp::Schema::Result::Foo' 'foo_id');
 __PACKAGE__->belongs_to( bar => 'MyApp::Schema::Result::Bar' 'bar_id');

or with DBIx::Class::Candy:

 package MyApp::Schema::Result::Foo_Bar;

 use DBIx::Class::Candy -components => ['Helper::Row::JoinTable'];

 join_table {
    left_class   => 'Foo',
    left_method  => 'foo',
    right_class  => 'Bar',
    right_method => 'bar',
 };

METHODS
All the methods take a configuration hashref that looks like the following:

 {
    left_class          => 'Foo',
    left_method         => 'foo',     # see NOTE
    left_method_plural  => 'foos',    # see NOTE, not required, used for
                                      # many_to_many rel name in right_class
                                      # which is not generated by default
    right_class         => 'Bar',
    right_method        => 'bar',     # see NOTE
    right_method_plural => 'bars',    # see NOTE, not required, used for
                                      # many_to_many rel name in left_class
                                      # which is not generated by default
    namespace           => 'MyApp',   # default is guessed via *::Foo
    self_method         => 'foobars', # not required, used for setting the name of the
                                      # join table's relationship in a has_many
                                      # which is not generated by default
 }

  join_table
This is the method that you probably want. It will set your table, add columns, set the primary key, and set up the relationships.

  add_join_columns
Adds two non-nullable integer fields named "${left_method}_id" and "${right_method}_id" respectively.

  generate_has_manys
Installs methods into "left_class" and "right_class" to get to the join table. The methods will be named what's passed into the configuration hashref as "self_method".

  generate_many_to_manys
Installs many_to_many methods into "left_class" and "right_class". The methods will be named what's passed into the configuration hashref as "left_method_plural" for the "right_class" and "right_method_plural" for the "left_class".

  generate_primary_key
Sets "${left_method}_id" and "${right_method}_id" to be the primary key.

  generate_relationships
This adds relationships to "${namespace}::Schema::Result::$left_class" and "${namespace}::Schema::Result::$left_class" respectively.

  set_table
This method sets the table to "${left_class}_${right_class}".

CANDY EXPORTS
If used in conjunction with DBIx::Class::Candy this component will export:

join_table
generate_primary_key
generate_has_manys
generate_many_to_manys
generate_relationships
set_table
add_join_columns

  NOTE
This module uses (an internal fork of) String::CamelCase to default the method names and uses Lingua::EN::Inflect for pluralization.

CHANGES BETWEEN RELEASES

  Changes since 0.*
Originally this module would use

       data_type         => 'integer',
       is_nullable       => 0,
       is_numeric        => 1,

for all joining columns. It now infers "data_type", "is_nullable", "is_numeric", and "extra" from the foreign tables.

AUTHOR
Arthur Axel "fREW" Schmidt <frioux+cpan@gmail.com>

COPYRIGHT AND LICENSE
This software is copyright (c) 2024 by Arthur Axel "fREW" Schmidt.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.