NAME

Mojolicious::Plugin::Model::DB - It is an extension of the module Mojolicious::Plugin::Model for Mojolicious applications.

SYNOPSIS

Model Functions

package MyApp::Model::Functions;
use Mojo::Base 'MojoX::Model';

sub trim {
    my ($self, $value) = @_;

    $value =~ s/^\s+|\s+$//g;

    return $value;
}

1;

Model DB Person

package MyApp::Model::DB::Person;
use Mojo::Base 'MojoX::Model';

sub save {
    my ($self, $foo) = @_;

    return $self->mysql->db->insert(
        'foo',
        {
            foo => $foo
        }
    )->last_insert_id;
}

1;

Mojolicious::Lite application

#!/usr/bin/env perl
use Mojolicious::Lite;

use lib 'lib';

plugin 'Model::DB' => {mysql => 'mysql://user@/mydb'};

any '/' => sub {
    my $c = shift;

    my $foo = $c->param('foo')
            ? $c->model('functions')->trim($c->param('foo')) # model functions
            : '';

    # model db Person
    my $id = $c->db('person')->save($foo);

    $c->render(text => $id);
};

app->start;

All available options

#!/usr/bin/env perl
use Mojolicious::Lite;

plugin 'Model::DB' => {
    # Mojolicious::Plugin::Model::DB
    namespace    => 'DataBase',                # default is DB

    # databases options
    Pg           => 'postgresql://user@/mydb', # this will instantiate Mojo::Pg, in model get $self->pg,
    mysql        => 'mysql://user@/mydb',      # this will instantiate Mojo::mysql, in model get $self->mysql,
    SQLite       => 'sqlite:test.db',          # this will instantiate Mojo::SQLite, in model get $self->sqlite,
    Redis        => 'redis://localhost',       # this will instantiate Mojo::Redis, in model get $self->redis,
    
    # or using reference
    Pg           => Mojo::Pg->new('postgresql://postgres@/test'),       # in model get $self->pg,
    mysql        => Mojo::mysql->strict_mode('mysql://username@/test'), # in model get $self->mysql,
    SQLite       => Mojo::SQLite->new('sqlite:test.db'),                # in model get $self->sqlite,
    Redis        => Mojo::Redis->new("redis://localhost:6379/1"),       # in model get $self->redis,

    # Mojolicious::Plugin::Model
    namespaces   => ['MyApp::Model', 'MyApp::CLI::Model'],
    base_classes => ['MyApp::Model'],
    default      => 'MyApp::Model::Pg',
    params       => {Pg => {uri => 'postgresql://user@/mydb'}}
};

DESCRIPTION

Mojolicious::Plugin::Model::DB It is an extension of the module Mojolicious::Plugin::Model, the intention is to separate models of database from other models, using Mojolicious::Plugin::Model::DB you can continue using all functions of Mojolicious::Plugin::Model. See more in Mojolicious::Plugin::Model.

OPTIONS

namespace

# Mojolicious::Lite
plugin 'Model::DB' => {namespace => 'DataBase'}; # It's will load from $moniker::Model::DataBase

Namespace to load models from, defaults to $moniker::Model::DB.

databases

Mojo::Pg

# Mojolicious::Lite
plugin 'Model::DB' => {Pg => 'postgresql://user@/mydb'};

# Model::DB
package MyApp::Model::DB::Foo;
use Mojo::Base 'MojoX::Model';

sub find {
    my ($self, $id) = @_;

    return $self->pg->db->select(
        'foo',
        undef,
        {
            id => $id
        }
    )->hash;
}

1;

Mojo::mysql

# Mojolicious::Lite
plugin 'Model::DB' => {mysql => 'mysql://user@/mydb'};

# Model::DB
package MyApp::Model::DB::Foo;
use Mojo::Base 'MojoX::Model';

sub find {
    my ($self, $id) = @_;

    return $self->mysql->db->select(
        'foo',
        undef,
        {
            id => $id
        }
    )->hash;
}

1;

Mojo::SQLite

# Mojolicious::Lite
plugin 'Model::DB' => {SQLite => 'sqlite:test.db'};

# Model::DB
package MyApp::Model::DB::Foo;
use Mojo::Base 'MojoX::Model';

sub find {
    my ($self, $id) = @_;

    return $self->sqlite->db->select(
        'foo',
        undef,
        {
            id => $id
        }
    )->hash;
}

1;

Mojo::Redis

# Mojolicious::Lite
plugin 'Model::DB' => {Redis => 'redis://localhost'};

# Model::DB
package MyApp::Model::DB::Foo;
use Mojo::Base 'MojoX::Model';

sub find {
    my ($self, $key) = @_;

    return $self->redis->db->get($key);
}

1;

Mojo::mysql and Mojo::Redis

# Mojolicious::Lite
plugin 'Model::DB' => {
    mysql => 'mysql://user@/mydb',
    Redis => 'redis://localhost'
};

# Model::DB
package MyApp::Model::DB::Foo;
use Mojo::Base 'MojoX::Model';

sub find {
    my ($self, $id) = @_;

    my $cache = $self->redis->db->get('foo:' . $id);
    return $cache if $cache;

    my $foo = $self->mysql->db->select(
        'foo',
        undef,
        {
            id => $id
        }
    )->hash;

    $self->redis->db->set('foo:' . $id, $foo);

    return $foo;
}

1;

more options

see in Mojolicious::Plugin::Model#OPTIONS

HELPERS

Mojolicious::Plugin::Model::DB implements the following helpers.

db

my $db = $c->db($name);

Load, create and cache a model object with given name. Default class for model db camelize($moniker)::Model::DB. Return `undef` if model db not found.

more helpers

see in Mojolicious::Plugin::Model#HELPERS

SEE ALSO

Mojolicious, Mojolicious::Guides, https://mojolicio.us, Mojolicious::Plugin::Model.

AUTHOR

Lucas Tiago de Moraes lucastiagodemoraes@gmail.com

COPYRIGHT AND LICENSE

This software is copyright (c) 2019 by Lucas Tiago de Moraes.

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