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=<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"
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
)
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
protected $connection = 'mysql';
protected $fillable = [
'name', 'email',
];
}
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',
];
}
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,
]);
}
}
That's it. You now have MySQL and MongoDB both fully working in a Laravel 12 app.
Top comments (2)
Kindly share your Github link for the code
thanks for sharing this article. Followed everything and getting error