Apresentação
Neste post vamos configurar dois bancos de dados na mesma aplicação Laravel:
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.
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
... e remova o 'ponto-e-vírgula' do início, salvando o arquivo em seguida.
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
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
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'))
para
'database' => env('', database_path('database.sqlite'))
Esta mudança é necessária porque o SQLite não possui um nome de banco de dados.
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=
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';
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');
});
}
Modelo
Na classe \app\Models\Movie.php vamos adicionar somente a propriedade que configura o nome da conexão no modelo:
protected $connection = 'sqlite';
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)
];
}
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();
}
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
O resultado esperado é a criação da tabela de usuários (users) no no MySQL e a tabela de filmes (movie) no SQLite.
Seed
Volte ao terminal e execute o comando:
php artisan db:seed
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
MarcioPolicarpo / laravel9-multi-database
Example of multi database connection in Laravel 9 applications
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:
- Simple, fast routing engine.
- Powerful dependency injection container.
- Multiple back-ends for session and cache storage.
- Expressive, intuitive database ORM.
- Database agnostic schema migrations.
- Robust background job processing.
- Real-time event broadcasting.
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.
Top comments (0)