Setting Up MySQL and MongoDB Together in Laravel 12

Sometimes you need relational data for parts of your app (MySQL) and flexible document storage for others (MongoDB). Here's how to set up both in Laravel 12. Install MongoDB PHP Extension sudo apt install ext-mongodb Install Required Composer Packages sudo composer require mongodb/mongodb sudo composer require mongodb/laravel-mongodb:^5.2 --with-all-dependencies .env example DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE= DB_USERNAME= DB_PASSWORD= MONGODB_USERNAME= MONGODB_PASSWORD= MONGODB_SERVER=127.0.0.1 MONGODB_PORT=27017 MONGODB_DATABASE= MONGODB_URI="mongodb://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@${MONGODB_SERVER}:${MONGODB_PORT}/${MONGODB_DATABASE}?directConnection=true&serverSelectionTimeoutMS=2000&authSource=admin&appName=mongosh+2.2.2?tls=false&authSource=admin" config/database.php use Illuminate\Support\Str; return [ 'default' => env('DB_CONNECTION', 'mysql'), 'connections' => [ 'mysql' => [ 'driver' => 'mysql', 'url' => env('DB_URL'), 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', '3306'), 'database' => env('DB_DATABASE', 'laravel'), 'username' => env('DB_USERNAME', 'root'), 'password' => env('DB_PASSWORD', ''), 'unix_socket' => env('DB_SOCKET', ''), 'charset' => env('DB_CHARSET', 'utf8mb4'), 'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'), 'prefix' => '', 'prefix_indexes' => true, 'strict' => true, 'engine' => null, 'options' => extension_loaded('pdo_mysql') ? array_filter([ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], 'mongodb' => [ 'driver' => 'mongodb', 'dsn' => env('MONGODB_URI', 'mongodb://'.env('MONGODB_USERNAME').':'.env('MONGODB_PASSWORD').'@'.env('MONGODB_SERVER').':'.env('MONGODB_PORT').'/'.env('MONGODB_DATABASE').'?directConnection=true&serverSelectionTimeoutMS=2000&authSource=admin&appName=mongosh+2.2.2?tls=false&authSource=admin'), 'database' => env('MONGODB_DATABASE'), ], ], ]; Model examples MySQL Model (User)

Apr 13, 2025 - 22:44
 0
Setting Up MySQL and MongoDB Together in Laravel 12

Sometimes you need relational data for parts of your app (MySQL) and flexible document storage for others (MongoDB). Here's how to set up both in Laravel 12.

Install MongoDB PHP Extension

sudo apt install ext-mongodb

Install Required Composer Packages

sudo composer require mongodb/mongodb
sudo composer require mongodb/laravel-mongodb:^5.2 --with-all-dependencies

.env example

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

MONGODB_USERNAME=
MONGODB_PASSWORD=
MONGODB_SERVER=127.0.0.1
MONGODB_PORT=27017
MONGODB_DATABASE=
MONGODB_URI="mongodb://${MONGODB_USERNAME}:${MONGODB_PASSWORD}@${MONGODB_SERVER}:${MONGODB_PORT}/${MONGODB_DATABASE}?directConnection=true&serverSelectionTimeoutMS=2000&authSource=admin&appName=mongosh+2.2.2?tls=false&authSource=admin"

config/database.php


use Illuminate\Support\Str;

return [

'default' => env('DB_CONNECTION', 'mysql'),

'connections' => [


'mysql' => [
    'driver' => 'mysql',
    'url' => env('DB_URL'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'laravel'),
    'username' => env('DB_USERNAME', 'root'),
    'password' => env('DB_PASSWORD', ''),
    'unix_socket' => env('DB_SOCKET', ''),
    'charset' => env('DB_CHARSET', 'utf8mb4'),
    'collation' => env('DB_COLLATION', 'utf8mb4_unicode_ci'),
    'prefix' => '',
    'prefix_indexes' => true,
    'strict' => true,
    'engine' => null,
    'options' => extension_loaded('pdo_mysql') ? array_filter([
    PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
    ]) : [],
],

'mongodb' => [
    'driver' => 'mongodb',
    'dsn' => env('MONGODB_URI', 'mongodb://'.env('MONGODB_USERNAME').':'.env('MONGODB_PASSWORD').'@'.env('MONGODB_SERVER').':'.env('MONGODB_PORT').'/'.env('MONGODB_DATABASE').'?directConnection=true&serverSelectionTimeoutMS=2000&authSource=admin&appName=mongosh+2.2.2?tls=false&authSource=admin'),
    'database' => env('MONGODB_DATABASE'),
    ],
],

];

Model examples

MySQL Model (User)



namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    protected $connection = 'mysql';

    protected $fillable = [
        'name', 'email',
    ];
}

MongoDB Model (Post)



namespace App\Models;

use MongoDB\Laravel\Eloquent\Model;

class Post extends Model
{
    protected $connection = 'mongodb';
    protected $collection = 'posts';

    protected $fillable = [
        'title',
        'body',
        'slug',
    ];
}

Example Controller



namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\User;
use App\Models\Post;

class ExampleController extends Controller
{
    public function store(Request $request)
    {
        $user = User::create([
            'name' => 'John Doe',
            'email' => 'john@example.com',
        ]);

        $post = Post::create([
            'title' => 'MongoDB Example',
            'body' => 'This is stored in MongoDB.',
            'slug' => 'mongodb-example',
        ]);

        return response()->json([
            'user' => $user,
            'post' => $post,
        ]);
    }
}

That's it. You now have MySQL and MongoDB both fully working in a Laravel 12 app.