Laravel Multiple Database Connectivity: A Step-by-Step Guide

ArjunAmrutiya
4 min readSep 16, 2023

--

Introduction:
Laravel, the popular PHP framework, is known for its elegant and powerful features that simplify web application development. One such feature is its ability to connect to multiple databases seamlessly. This can be incredibly useful when you need to work with multiple data sources, such as connecting to different databases for users, products, and analytics. In this blog post, we will provide a step-by-step guide on how to set up and use multiple database connections in Laravel, accompanied by real-time examples.

Why Use Multiple Database Connections?

Before diving into the technical details, let’s briefly explore why you might need multiple database connections in your Laravel application:

Separation of Concerns:
Different data often belongs to different domains or services. For example, user-related data might be stored in one database, while product-related data is stored in another. Separating them into distinct databases helps maintain a clear separation of concerns.

Performance Optimization:
By distributing your data across multiple databases, you can optimize database performance. For instance, you can use a dedicated database for read-heavy operations and another for write-heavy operations.

Third-Party Integrations:
Sometimes, you may need to connect to external or legacy databases that don’t conform to your primary database schema. Multiple connections enable you to work with these data sources efficiently.

Now, let’s get started with a step-by-step guide.

Step 1: Configure Database Connections

In Laravel, database configuration is done in the config/database.php file. To set up multiple database connections, you need to define each connection in this file.

// config/database.php

'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
// ...
],

'second_db' => [
'driver' => 'mysql',
'host' => env('SECOND_DB_HOST', '127.0.0.1'),
'port' => env('SECOND_DB_PORT', '3306'),
'database' => env('SECOND_DB_DATABASE', 'forge'),
'username' => env('SECOND_DB_USERNAME', 'forge'),
'password' => env('SECOND_DB_PASSWORD', ''),
// ...
],
// Add more database connections as needed
],

In this example, we’ve defined two database connections: ‘mysql’ (the default connection) and ‘second_db’. You can add more connections as required, each with its own configuration.

Step 2: Set Environment Variables

To keep sensitive database credentials secure, use Laravel’s environment file (.env) to store them. Open your .env file and set the environment variables for each database connection.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=your_database
DB_USERNAME=your_username
DB_PASSWORD=your_password

SECOND_DB_CONNECTION=mysql
SECOND_DB_HOST=127.0.0.1
SECOND_DB_PORT=3306
SECOND_DB_DATABASE=second_database
SECOND_DB_USERNAME=second_username
SECOND_DB_PASSWORD=second_password

Ensure that the environment variable names match those defined in config/database.php.

Step 3: Create Models

Next, create Eloquent models for each database connection. You can do this using the artisan command:

php artisan make:model User -m
php artisan make:model Product -m

This command generates model files and migration files for each model. Be sure to specify the connection in the generated model files:

// app/Models/User.php
protected $connection = 'mysql';
// app/Models/Product.php
protected $connection = 'second_db';

Step 4: Run Migrations

Now, you can run migrations for each connection separately:

php artisan migrate
php artisan migrate --database=second_db

This will create the necessary tables in their respective databases.

Step 5: Query Data from Multiple Databases

You can now query data from multiple databases using Eloquent. Here’s an example of how to retrieve users and products from our two databases:

use App\Models\User;
use App\Models\Product;

// Retrieve users from the 'mysql' database
$users = User::all();

// Retrieve products from the 'second_db' database
$products = Product::all();

Laravel takes care of routing your queries to the correct database based on the model’s connection property.

Real-Time Example: Multi-Tenant Application

To illustrate the power of multiple database connections, let’s consider a real-time example: building a multi-tenant application where each tenant has its own database. This architecture ensures data isolation and scalability.

Configure the Tenant Connection:
Dynamically set the database connection based on the current tenant. You can do this in middleware or service providers.

Switching Connections:
Use the DB facade to switch connections during runtime. For example:

DB::connection('tenant_xyz')->table('some_table')->get();

Tenant Management:
Implement logic to handle tenant management, such as onboarding new tenants and creating their databases.

Conclusion:
Laravel’s support for multiple database connections makes it a versatile choice for building complex web applications that require data isolation and scalability. By following this step-by-step guide and understanding the real-time example, you can harness the power of multiple databases in your Laravel projects. Whether you’re building a multi-tenant application or need to work with various data sources, Laravel has you covered. Happy coding!

Go forth and get more out of your content. Go forth and conquer Medium! (and while you’re at it, follow me on Medium! and feel free to Subscribe)

Found this post useful? Kindly tap the 👏 button below! :)

🌟 Enjoy my blogging content? Support my work by buying me a virtual coffee on BuyMeACoffee! Your contributions help fuel insightful tech articles. Join hands in making coding more accessible and exciting for all. https://www.buymeacoffee.com/arjunamrutiya🚀

--

--

ArjunAmrutiya

👋 Hey there! I'm Arjun Amrutiya, a passionate web developer and blogger who loves all things PHP, Laravel and Vue.js. Welcome to my Medium account!