DEV Community

Edgaras
Edgaras

Posted on

2 1 1 1

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
Enter fullscreen mode Exit fullscreen mode

Install Required Composer Packages

sudo composer require mongodb/mongodb
sudo composer require mongodb/laravel-mongodb:^5.2 --with-all-dependencies
Enter fullscreen mode Exit fullscreen mode

.env example

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<CHANGE-TO-YOUR-MYSQL-DATABASE>
DB_USERNAME=<CHANGE-TO-YOUR-MYSQL-USERNAME>
DB_PASSWORD=<CHANGE-TO-YOUR-MYSQL-PASSWORD>

MONGODB_USERNAME=<CHANGE-TO-YOUR-MONGODB-USERNAME>
MONGODB_PASSWORD=<CHANGE-TO-YOUR-MONGODB-PASSWORD>
MONGODB_SERVER=127.0.0.1
MONGODB_PORT=27017
MONGODB_DATABASE=<CHANGE-TO-YOUR-MONGODB-COLLECTION>
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"
Enter fullscreen mode Exit fullscreen mode

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'),
    ],
],

];
Enter fullscreen mode Exit fullscreen mode

Model examples

MySQL Model (User)

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

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

    protected $fillable = [
        'name', 'email',
    ];
}
Enter fullscreen mode Exit fullscreen mode

MongoDB Model (Post)

<?php

namespace App\Models;

use MongoDB\Laravel\Eloquent\Model;

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

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

Enter fullscreen mode Exit fullscreen mode

Example Controller

<?php

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,
        ]);
    }
}

Enter fullscreen mode Exit fullscreen mode

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

Top comments (2)

Collapse
 
kentuchi_ke profile image
kelvin

Kindly share your Github link for the code

Collapse
 
programmingmindset profile image
Programming Mindset

thanks for sharing this article. Followed everything and getting error

Image description