Multi-banco de dados em aplicações Laravel

marciopolicarpo

Marcio Policarpo

Posted on August 16, 2022

Multi-banco de dados em aplicações Laravel

Apresentação

Neste post vamos configurar dois bancos de dados na mesma aplicação Laravel:

  • SQLite: banco de dados em arqtuivo
  • MySQL: SGBD que dispensa apresentações

A ideia é que o projeto seja pequeno, apenas com o essencial para atingirmos o que está sendo proposto.

Entretanto, convém alertar que conhecimento prévio no framework Laravel é essencial, mais por conta de saber como se localizar dentro da aplicação do que pela linguagem PHP propriamente dita.

Conhecimento de banco de dados não é essencial mas se tiver, melhor.


Este artigo foi dividido em etapas de forma que você possa ir direto para cada uma delas caso se sinta confortável ou já tenha realizado atividades semelhantes.

O que você precisa para executar este projeto
Esta etapa traz os programas necessários para acompanhar este artigo.

Ambiente
Esta etapa mostra como o ambiente deve estar configurado.

Projeto
Esta etapa é a maior. Vamos criar e configurar o projeto para alcançar o objetivo proposto.

Execução
Aqui vamos executar o projeto verificando o resultado.

Conclusão


O que você precisa para executar este projeto

PHP

No momento em que escrevo este artigo o PHP está na sua versão 8.1.

Criado em 1994 por Rasmus Lerdorf, teve sua primeira versão liberada somente em 1995 como um pacote de programas CGI.

Atualmente é mantido pelo PHP Group.


Composer

Até meados da década de 1990, era comum o desenvolvedor criar 'na mão' rotinas auxiliares para a aplicação principal, como conectar com bancos de dados por exemplo.

Entretanto, com a popularização da internet muitas dessas rotinas foram parar em repositórios mantidos por desenvolvedores do mundo todo.

E para facilitar a pesquisa e uso dessas rotinas surgiram os gerenciadores de dependências.

Por exemplo, para c# há o Nuget; para JavaScript temos o NPM.

E no PHP existe o Composer.

O repositório acessado pelo Composer é o Packagist.

A partir da versão 9 do Laravel recomenda-se que seja utilizado o PHP 8 ou superior.


MySQL

De acordo com a pesquisa anual Stack Overflow Developer Survey 2002, o MySQL Server foi o banco de dados escolhido por mais de 46% do total de respostas e foi citado por 58% das pessoas que estão aprendendo a desenvolver.

Se você se sentir confortável, sugiro instalar individualmente tanto o PHP quando o MySQL.

Se este não for o seu caso, existem pacotes que facilitam a instalação do PHP e MySQL, além de trazer também o Apache como servidor web.


SQLite

Este é um banco de dados pequeno, independente e desenvolvido em C.

Devido à sua versatilidade ele é largamente utilizado em smartphones.

Por conter toda lógica de SQL em um único arquivo físico ele também é usado como "cache" de outras aplicações com o objetivo de reduzir tráfego de rede e processos de I/O em servidores.


Gerenciador de banco de dados

A depender de como a instalação do MySQL foi feita você terá acesso ao banco de dados através do navegador de internet padrão com o PHPMyAdmin.

Entretanto, sugiro a utilização de um gerenciador de banco de dados, como por exemplo DBeaver.

Ele é gratuito e se conecta em quase todos os SGBDs disponíveis na atualidade.


Editor de textos

Há opções para todos os gostos e sistemas operacionais.

Estou utilizando Visual Studio Code.

Além de ser gratuito, possibilita a instalação de diversas extensões.


Ambiente

PHP

Antes de iniciarmos o projeto é necessário fazer uma pequena alteração no arquivo de configuração do PHP.

O local do arquivo php.ini vai depender de como a instalação foi realizada.

Utilizando o editor de textos de sua preferência abra o arquivo php.ini e localize a seção Dynamic Extensions.

Dentro dessa seção navegue até a seguinte linha ...



;extension=pdo_sqlite


Enter fullscreen mode Exit fullscreen mode

... e remova o 'ponto-e-vírgula' do início, salvando o arquivo em seguida.


MySQL

A ação seguinte pode ser feita através do console do MySQL, pelo gerenciador de banco de dados ou pelo PHPMyAdmin, caso você tenha instalado o MySQL através de um pacote como XAMP ou WAMP.

Acessando o servidor do MySQL crie um banco de dados identificado como 'laravel'.

Informe outro caso este nome já esteja em uso.

Este nome deve ser colocado na variável 'DB_DATABASE' do arquivo '.env' que veremos mais à frente.


Projeto

Criação

Abra o terminal de sua preferência, acesse a pasta que servirá de ponto de partida para o projeto e digite o seguinte comando:



composer create-project laravel/laravel multi-database


Enter fullscreen mode Exit fullscreen mode

O tempo para conclusão desta etapa pode variar de acordo com a conexão à internet e configuração do computador.


Ainda no terminal acesse o diretório raiz do projeto criado e digite o seguinte comando:



php artisan make:model Movie -mf


Enter fullscreen mode Exit fullscreen mode

A finalidade deste comando é criar um modelo objeto relacional (model) para guardarmos uma lista de filmes.

Os parâmetros opcionais '-mf' vão orientar o artisan a criar também a migração ('m') e uma classe factory('f'), economizando tempo.


Arquivo database.php

Este arquivo guarda os detalhes de conexão com bancos de dados e faremos uma pequena alteração nele.

Na seção Database Connections localize o nó sqlite e nele, altere a propriedade database de ...



'database' => env('DB_DATABASE', database_path('database.sqlite'))


Enter fullscreen mode Exit fullscreen mode

para



'database' => env('', database_path('database.sqlite'))


Enter fullscreen mode Exit fullscreen mode

Esta mudança é necessária porque o SQLite não possui um nome de banco de dados.


Arquivo .env

Este arquivo se encontra no diretório raiz da aplicação e faremos uma pequena modificação para conectar ao MySQL.

Com o arquivo no editor, localize as variáveis iniciadas com DB_ e altere os valores para ficar de acordo com a configuração feita na instalação do MySQL:



DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=


Enter fullscreen mode Exit fullscreen mode

onde:

  • DB_DATABASE: nome do banco de dados configurado aqui
  • DB_USERNAME: usuário do banco de dados (geralmente root)
  • DB_PASSWORD: senha do banco de dados

Salve e feche este arquivo.


Migração

No arquivo de migração que foi criado nesta etapa vamos incluir uma propriedade protegida chamada $connection que receberá o nome da conexão utilizada pela migração desta tabela:



protected $connection = 'sqlite';


Enter fullscreen mode Exit fullscreen mode

E para finalizar as alterações neste arquivo de migração, vamos colocar duas colunas (title, imdb_rating) no método up():



public function up()
{
    Schema::create('movies', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->string('title');
        $table->decimal('imdb_rating');
    });
}


Enter fullscreen mode Exit fullscreen mode

Modelo

Na classe \app\Models\Movie.php vamos adicionar somente a propriedade que configura o nome da conexão no modelo:



protected $connection = 'sqlite';


Enter fullscreen mode Exit fullscreen mode

Seed

Utilizando o facilitador para criar registros aleatórios vamos editar a classe \database\factories\MovieFactory.php criada nesta etapa e alterar o método ´definition()´ ficando como mostrado a seguir:



public function definition()
{
    return [
        'title' => fake()->word(),
        'imdb_rating' => fake()->randomFloat(1, 1, 10)
    ];
}


Enter fullscreen mode Exit fullscreen mode

Em seguida vamos editar a classe \database\seeders\DatabaseSeeder.php alterando o método ´run()´ para que fique de acordo com o código mostrado abaixo:



public function run()
{
    \App\Models\User::factory(5)->create();
    \App\Models\Movie::factory(5)->create();
}


Enter fullscreen mode Exit fullscreen mode

Salve os arquivos confirmando as alterações.


Execução

Migração

Certifique-se que o banco de dados está rodando, acesse o terminal novamente e digite o seguinte comando:



php artisan migrate


Enter fullscreen mode Exit fullscreen mode

O resultado esperado é a criação da tabela de usuários (users) no no MySQL e a tabela de filmes (movie) no SQLite.

Database connection


Seed

Volte ao terminal e execute o comando:



php artisan db:seed


Enter fullscreen mode Exit fullscreen mode

Agora temos 5 usuários e 5 filmes, cada um na sua respectiva tabela.

Optei por criar uma tabela pequena porque, como citado no início do artigo, o objetivo é mostrar os passos para configurar e utilizar mais de um banco de dados na mesma aplicação.


Conclusão

Este cenário pouco comum tem diversas aplicabilidades.

Podemos, por exemplo, manter o registro de atividades da aplicação
em um banco de dados separado para efeitos de auditoria futura.

Outra possibilidade é criar um middleware que grave em uma tabela todas as requisições de entrada que foram realizadas em um período de tempo.

Repositório

O código completo deste projeto pode ser visto

GitHub logo MarcioPolicarpo / laravel9-multi-database

Example of multi database connection in Laravel 9 applications

Build Status Total Downloads Latest Stable Version License

About Laravel

Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experience to be truly fulfilling. Laravel takes the pain out of development by easing common tasks used in many web projects, such as:

Laravel is accessible, powerful, and provides tools required for large, robust applications.

Learning Laravel

Laravel has the most extensive and thorough documentation and video tutorial library of all modern web application frameworks, making it a breeze to get started with the framework.

If you don't feel like reading, Laracasts can help. Laracasts contains over 2000 video tutorials on a range of topics including Laravel, modern PHP, unit testing, and JavaScript…




.

Obrigado pela leitura e até a próxima.

Deixe nos comentários alguma situação onde seria interessante ter acesso simultâneo a mais de um banco de dados.

💖 💪 🙅 🚩
marciopolicarpo
Marcio Policarpo

Posted on August 16, 2022

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related