NAME

DBIx::Lite::Schema

VERSION

version 0.36

OVERVIEW

This class holds the very loose schema definitions that enable some advanced features of DBIx::Lite. Note that you can do all main operations, including searches and manipulations, with no need to define any schema.

An empty DBIx::Lite::Schema is created every time you create a DBIx::Lite object. Then you can access it to customize it. Otherwise, you can prepare a Schema object and reutilize it across multiple connections:

my $schema = DBIx::Lite::Schema->new;
my $conn1 = DBIx::Lite->new(schema => $schema)->connect(...);
my $conn2 = DBIx::Lite->new(schema => $schema)->connect(...);

new

The constructor takes no arguments.

table

This method accepts a table name and returs the DBIx::Lite::Schema::Table object corresponding to the requested table. You can then call methods on it.

$schema->table('books')->autopk('id');

one_to_many

This methods sets up a 1-to-N relationship between two tables. Just pass two table names to it, appending the relation key column name:

$schema->one_to_many('authors.id' => 'books.author_id');

This will have the following effects:

provide a books accessor method in the authors Result objects
provide a books accessor method in the authors ResultSet objects
allow to call <$author-insert_related('books', {...})>>

If you supply a third argument, it will be used to set up the reverse accessor method. For example this will install a author accessor method in the books Result objects:

$schema->one_to_many('authors.id' => 'books.author_id', 'author');

If you also want to customize the accessor for the first table, you can supply an arrayref with both accessor names. This can be needed when the second table has two fields referencing the same table:

$schema->one_to_many('authors.id' => 'books.author_id', [ 'books_as_author', 'author' ]);
$schema->one_to_many('authors.id' => 'books.curator_id', [ 'books_as_curator', 'curator' ]);

Note that relationships can be chained:

$dbix->schema->one_to_many('authors.id' => 'books.author_id');
$dbix->schema->one_to_many('books.id' => 'chapters.books_id');
my @chapters = $dbix
    ->table('authors')
    ->search({ country => 'IT' })
    ->books
    ->chapters
    ->search({ page_count => { '>' => 20 } })
    ->all;

You can use the same approach to traverse many-to-many relationships.

AUTHOR

Alessandro Ranellucci <aar@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2024 by Alessandro Ranellucci.

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