Conectando no banco de dados com o Eloquent - Entendendo o padrão MVC na prática Artigo

Conheça os cursos gratuitos do WebDevBr! - Inscreva-se!


Este artigo foi publicado a 1 ano, 2 meses, 2 semanas, 4 dias atrás.

Continuando nossa série, desta vez quero mostrar como unir Illuminate/Database (vulgo Eloquent) e Slim Framework e assim prover-nos de uma sólida e eficiente camada de Model com ORM, Query Builder, multiplas conexões, tudo o que você tem direito e mais.

Migrations

Antes de configurar o Eloquent eu preciso de uma tabela no banco de dados (!!!), eu prezo muito a facilidade futura do deploy (publicar o projeto, muitos fazem com FTP, outros com Git, enfim...) e por isso eu prefiro manter as alterações do meu banco de dados usando migrations, assim eu posso atualizar no servidor automaticamente ao enviar as alterações, um dia eu falo um pouco mais sobre isso aqui.

A ideia do migration é que ele registra alterações que podem avançar e voltar com um simples comando no console (Terminal, CMD...) enquanto mantém um histórico do que foi feito.

Gostou deste artigo?

Receba atualizações semanais com novos artigos do WebDevBr e outras dicas!

Aqui vou usar o Phinx, inclusive estamos usando ele também para pegar as configurações da aplicação através do phinx.yml, lembra da aula passada?

Logo no começo do phinx.yml temos os seguintes itens:

paths:
    migrations: %%PHINX_CONFIG_DIR%%/db/migrations
    seeds: %%PHINX_CONFIG_DIR%%/db/seeds

Ele dita aonde os nosso arquivos de migrations e seeds vão ficar.

Seeds (sementes em inglês) são feitos para você inserir os dados na sua aplicação, embora você possa fazer muito mais que isso (eu uso pra testes e cadastro dos dados iniciais da aplicação).

Então vamos por a mão na massa.

Os diretórios são criados pelo Phinx automaticamente, se este não for o seu caso (vai saber) então primeiro crie um diretório na raiz chamado db com outros dois dentro deste chamados migrations e seeds.

E vamos criar nosso primeiro migration, rode o comando a seguir

vendor/bin/phinx create UsersTable

O parâmetro UsersTable é o nome que vou dar a minha classe de migration.

E dentro de db/migrations você verá um arquivo mais ou menus assim: 20160211142859_users_table.

Estes números são, na verdade, a data e hora da criação do arquivo, veja: 2016-02-11 14:28:59

Ele se parece com:

<?php

use Phinx\Migration\AbstractMigration;

class UsersTable extends AbstractMigration
{
    public function change()
    {
        //aqui vai o nosso código
    }
}

Se você não se ligou, eu vou colocar o código ali aonde está o comentário //aqui vai o nosso código, não tem sql, apenas um objeto informando como nossa tabela deve ser:

$table = $this->table('users'); //o comando table() informa o nome da tabela
$table->addColumn('name', 'string') // o comando addColumn adiciona as colunas
      ->addColumn('email', 'string') // o primeiro campo é o nome e o segundo o tipo
      ->addColumn('password', 'string') // você pode informar parâmetros que não usei aqui
      ->create(); // o comando create() finalmente cria a tabela no banco

Comentei o código, acredito que não vai precisar de muito mais, apenas quero reforçar que é perfeitamente possível informar parâmetros mais avançados, como tamanho dos campos, chaves estrangeiras e etc.

Se você gastar alguns minutos aqui da pra ter uma ideia da quantidade de coisas que o Phinx permite automatizar e você evitar usar o SQL.

Obs.: O Phinx não ignora e nem deve substituir a elaboração criteriosa de um banco de dados, não é a ideia dele.

Para criar a tabela:

vendor/bin/phinx migrate

Uma vez que a tabela seja criada você não vai poder rodar este migration novamente sem fazer um rollback (voltar o histórico do Phinx).

Seeds

Vou aproveitar para cria um Seed, eu já expliquei acima, mas só pra reforçar:

Seeds (sementes em inglês) são feitos para você inserir os dados na sua aplicação, embora você possa fazer muito mais que isso (eu uso pra testes e cadastro dos dados iniciais da aplicação).

Para criar um seed você usa o comando a seguir:

vendor/bin/phinx seed:create Users

O parâmetro Users é o nome que vou dar a minha classe de seed.

Ele vai criar um arquivo em db/seeds/Users.php com o seguinte conteúdo:

<?php

use Phinx\Seed\AbstractSeed;

class Users extends AbstractSeed
{
    public function run()
    {
        $this->execute('TRUNCATE users');

        $data = [
            [
                'name' => 'Erik Figueiredo',
                'email' => 'contato@webdevbr.com.br',
                'password' => '123456',
            ]
        ];

        $tasks = $this->table('users');
        $tasks->insert($data)
              ->save();
    }
}

Por padrão eu sempre coloco um truncate no começo do meu seed, porque se você tentar inserir ele de novo vai conseguir acabar com dados duplicados, menos em casos raros em que a estrutura do banco não permita, como campos com valores únicos.

Para rodar os seeds:

vendor/bin/phinx seed:run

Banco criado e dados iniciais cadastrados, vamos, ao Eloquent.

Eloquent

E finalmente o alvo do nosso desejo, integrar o Eloquent com o Slim. Neste passo vou configurar o Eloquent e testar a conexão com o banco, mas antes disso veja como se parece a inicialização do Eloquent.

use Illuminate\Database\Capsule\Manager as Db;

//configurações de acesso ao banco
$db_config = [
    'host'=>'localhost'
    'name'=>'database_name'
    'user'=>'root'
    'pass'=>'1234'
];

$db = new Db;

$db->addConnection([
    'driver'    => 'mysql',
    'host'      => $db_config['host'],
    'database'  => $db_config['name'],
    'username'  => $db_config['user'],
    'password'  => $db_config['pass'],
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

$db->setAsGlobal();
$db->bootEloquent();

Agora no nosso caso, o arquivo fica assim:

<?php

include __DIR__.'/vendor/autoload.php';

use WebDevBr\Mvc\Config;
use Illuminate\Database\Capsule\Manager as Db;

Config::init();

//se estivermos em desenvolvimento
if (Config::get('debug')) {
    //usamos as configurações de conexão em 'development'
    $db_config = Config::get('development');

    $run     = new Whoops\Run;
    $handler = new Whoops\Handler\PrettyPageHandler;
    $run->pushHandler($handler);
    $run->register();
} else {
    //caso contrário
    //usamos as configurações de conexão em 'development'
    $db_config = Config::get('production');
}

//configurações do Eloquant
$db = new Db;

$db->addConnection([
    'driver'    => 'mysql',
    'host'      => $db_config['host'],
    'database'  => $db_config['name'],
    'username'  => $db_config['user'],
    'password'  => $db_config['pass'],
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
]);

$db->setAsGlobal();
$db->bootEloquent();

//aqui eu testo se esta tudo certo
$user = Db::table('users')->where('id',1)->get();

//vejo se listou o registro do banco
var_dump($user);

Eu montei desta forma para facilitar o entendimento deste artigo separadamente, continue vendo a série para aprender como usar containers no Slim Framework e integrar o Eloquent.

Até a próxima!


Cursos relacionados


* Parcelamento apenas cartão de crédito! Pode haver uma pequena variação no parcelamento em relação a simulações apresentadas!