Cara Menghubungkan Laravel dengan MongoDB dan Membuat CRUD API

| | | Laravel, PHP, MongoDB
Cara Menghubungkan Laravel dengan MongoDB dan Membuat CRUD API

MongoDB adalah database NoSQL yang menyimpan data dalam format dokumen, tidak seperti MySQL yang pakai tabel dan relasi. Kalian pernah install MongoDB di Windows sebelumnya? Kalau belum, sebaiknya baca dulu sebelum lanjut di sini.

kenapa pakai MongoDB? Beberapa keunggulan:

  • Schema fleksibel , tidak perlu mendefinisikan struktur tabel terlebih dahulu
  • Scalable , mudah distribute ke banyak server
  • Document-based , cocok untuk data yang berubah-ubah strukturnya

di panduan ini kalian akan belajar cara menghubungkan Laravel dengan MongoDB dan membuat aplikasi CRUD sederhana.

Zaman Dulu vs Zaman Sekarang

Buat kalian yang pernah coba integrasi Laravel + MongoDB beberapa tahun lalu, pasti ingat betapa ribetnya. Saya sendiri pernah frustrasi saat mencoba hal yang sama di tahun 2021.

Zaman Dulu (2019-2023) , Era Bingung

Dulu integrate MongoDB di Laravel itu seperti masuk dunia yang berbeda. Kita harus bergantung ke library community jenssegers/mongodb yang dibuat satu orang sukarelawan bernama Jens Segers. Bukan berarti library-nya jelek, tapi ya itu , dibuat oleh satu orang.

Saya masih ingat langkah-langkahnya:

  1. Install library dari Composer, tapi harus pilih versi yang cocok dengan Laravel
composer require jenssegers/mongodb:3.9
  1. Buka config/app.php, tambah manual service provider
'providers' => [
    ...
    Jenssegers\Mongodb\MongodbServiceProvider::class,
],
  1. Konfigurasi database.php dengan format yang kadang error
'mongodb' => [
    'driver' => 'mongodb',
    'host' => env('DB_HOST', '127.0.0.1'),
    'database' => env('DB_DATABASE', 'homestead'),
    ...
],
  1. Model pakai namespace yang berbeda dari biasanya
use Jenssegers\Mongodb\Eloquent\Model;

class Article extends Model { ... }
  1. Query Builder-nya juga beda , pakai DB::collection() bukan DB::table()

Dan masalahnya? Banyak:

  • Version conflict , Mau upgrade Laravel ke versi baru? Bersiap-siap library-nya tidak jalan. Saya sendiri pernah stuck di Laravel 8 karena library-nya belum support Laravel 9.
  • Dokumentasiamburadul , Setiap versi Laravel, cara pakainya kadang berubah. Tutorial di internet zaman now sudah tidak applicable.
  • Komunitas kecil , StackOverflow jawabannya sedikit, forum Indonesia jumlahnya bahkan lebih sedikit.
  • Maintenance tidak pasti , Apakah library-nya masih di-update? Apakah akan tetap compatible tahun depan?

Saya sampai pernah quit pakai MongoDB karena frustrasi ini. “Ribet amat,” pikir saya waktu itu.

Zaman Sekarang (2024+) , Era Tenang

Tapi kemudian MongoDB menyadari ekosistem di sekitar produk mereka. Mereka melihat begitu banyak developer PHP/Laravel yang struggle. Jadi mereka putuskan: buat official package.

Dan boom , sekarang semuanya berubah.

composer require mongodb/laravel-mongodb

Satu baris. selesai. Tidak perlu register service provider, tidak perlu konfigurasi ribet. Laravel auto-discovery langsung handle.

Namespace-nya juga berubah jadi official:

use MongoDB\Laravel\Eloquent\Model;

class Article extends Model { ... }

Dan query builder-nya? Tinggal tambah .connection('mongodb'):

use Illuminate\Support\Facades\DB;

$articles = DB::connection('mongodb')->collection('articles')->get();

Mantap kan?

Keunggulan package official:

  • Tim besar , bukan satu orang, tapi tim MongoDB yang dedicated
  • Update rutin , mengikuti versi Laravel dan MongoDB server
  • Dokumentasi lengkap , https://www.mongodb.com/docs/laravel/mongodb/
  • Future-proof , selama Laravel ada update, package ini juga di-update

Jadi kalau kalian masih ketemu tutorial lama yang pakai jenssegers/mongodb , itu sudah deprecated. Tidak disarankan lagi. Pindah ke package official sekarang juga.

Syarat Awal

Sebelum mulai, pastikan kalian sudah install:

  1. PHP 8.1+ , cek dengan php -v
  2. Composer , untuk install library
  3. MongoDB , running di localhost:27017 atau pakai MongoDB Atlas (cloud)
  4. Ekstensi PHP MongoDB , tanpa ini, PHP tidak bisa komunikasi dengan MongoDB

Cek apakah ekstensi MongoDB sudah terinstall

php -m | findstr mongodb

kalau tidak muncul apa-apa, install dulu:

Windows (XAMPP/Laragon):

  1. Download dari https://pecl.php.net/package/mongodb
  2. Pilih versi sesuai PHP kalian (cek php -v)
  3. Download file DLL yang Thread Safe atau Non-Thread Safe sesuai PHP
  4. Ekstrak, copy php_mongodb.dll ke folder ext PHP
  5. Edit php.ini, tambahkan extension=php_mongodb.dll
  6. Restart Apache

Linux/Mac:

pecl install mongodb

lalu tambahkan extension=mongodb.so di php.ini.

Docker (recommended): Kalau pakai Docker, cukup tambah service di docker-compose.yml:

mongodb:
    image: mongo:7
    ports:
        - "27017:27017"
    environment:
        MONGO_INITDB_DATABASE: laravel

Install Project Laravel

Untuk panduan ini, pakai Laravel 11. Kalau belum punya, install dulu:

composer create-project laravel/laravel belajar-mongodb-laravel
cd belajar-mongodb-laravel

Install Package MongoDB Official

Laravel tidak langsung support MongoDB. Kalian butuh package official dari MongoDB:

composer require mongodb/laravel-mongodb

Ini adalah package resmi dari MongoDB. Mendukung Laravel 10 dan 11.

Konfigurasi Database MongoDB

Di file .env

Buka .env, ubah koneksi database:

DB_CONNECTION=mongodb
DB_HOST=127.0.0.1
DB_PORT=27017
DB_DATABASE=laravel
DB_USERNAME=
DB_PASSWORD=

Kalau pakai MongoDB Atlas (cloud):

DB_CONNECTION=mongodb
DB_HOST=cluster0.xxxxxx.mongodb.net
DB_PORT=27017
DB_DATABASE=laravel
DB_USERNAME=USERNAME_ANDA
DB_PASSWORD=PASSWORD_ANDA

Konfigurasi di config/database.php (opsional)

Di Laravel 11, koneksi MongoDB sudah otomatis ter-register setelah install library. Tapi kalau mau konfigurasi manual, tambah di config/database.php:

'mongodb' => [
    'driver' => 'mongodb',
    'dsn' => env('DB_DSN'),
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', 27017),
    'database' => env('DB_DATABASE', 'laravel'),
    'username' => env('DB_USERNAME'),
    'password' => env('DB_PASSWORD'),
    'options' => [
        'appname' => 'laravel-mongodb',
    ],
],

Membuat Model dan Controller CRUD

1. Buat Model

Jalankan command:

php artisan make:model Article

Buka app/Models/Article.php, ubah isinya:

<?php

namespace App\Models;

use MongoDB\Laravel\Eloquent\Model;

class Article extends Model
{
    protected $connection = 'mongodb';
    protected $collection = 'articles';

    protected $fillable = [
        'title',
        'content',
        'author',
        'tags',
    ];

    protected $casts = [
        'tags' => 'array',
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
    ];
}

Penjelasan:

  • extends Model dari Jenssegers\Mongodb , bukan dari Illuminate\Eloquent
  • $connection = 'mongodb' , pakai koneksi MongoDB
  • $collection = 'articles' , nama collection di MongoDB
  • $casts['tags'] = 'array' , field tags otomatis di-cast jadi array PHP

2. Buat Controller

php artisan make:controller ArticleController

Buka app/Http/Controllers/ArticleController.php:

<?php

namespace App\Http\Controllers;

use App\Models\Article;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
    // READ - Ambil semua data
    public function index()
    {
        $articles = Article::all();
        return response()->json([
            'success' => true,
            'data' => $articles,
        ]);
    }

    // CREATE - Simpan artikel baru
    public function store(Request $request)
    {
        $article = Article::create([
            'title' => $request->title,
            'content' => $request->content,
            'author' => $request->author,
            'tags' => $request->tags ?? [],
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Artikel berhasil dibuat',
            'data' => $article,
        ], 201);
    }

    // READ - Ambil satu artikel
    public function show(string $id)
    {
        $article = Article::find($id);

        if (!$article) {
            return response()->json([
                'success' => false,
                'message' => 'Artikel tidak ditemukan',
            ], 404);
        }

        return response()->json([
            'success' => true,
            'data' => $article,
        ]);
    }

    // UPDATE - Update artikel
    public function update(Request $request, string $id)
    {
        $article = Article::find($id);

        if (!$article) {
            return response()->json([
                'success' => false,
                'message' => 'Artikel tidak ditemukan',
            ], 404);
        }

        $article->update([
            'title' => $request->title ?? $article->title,
            'content' => $request->content ?? $article->content,
            'author' => $request->author ?? $article->author,
            'tags' => $request->tags ?? $article->tags,
        ]);

        return response()->json([
            'success' => true,
            'message' => 'Artikel berhasil diupdate',
            'data' => $article,
        ]);
    }

    // DELETE - Hapus artikel
    public function destroy(string $id)
    {
        $article = Article::find($id);

        if (!$article) {
            return response()->json([
                'success' => false,
                'message' => 'Artikel tidak ditemukan',
            ], 404);
        }

        $article->delete();

        return response()->json([
            'success' => true,
            'message' => 'Artikel berhasil dihapus',
        ]);
    }
}

3. Tambah Route

Buka routes/api.php, tambahkan:

use App\Http\Controllers\ArticleController;

Route::get('/articles', [ArticleController::class, 'index']);
Route::post('/articles', [ArticleController::class, 'store']);
Route::get('/articles/{id}', [ArticleController::class, 'show']);
Route::put('/articles/{id}', [ArticleController::class, 'update']);
Route::delete('/articles/{id}', [ArticleController::class, 'destroy']);

Testing CRUD

Jalankan server:

php artisan serve

Test dengan cURL atau Postman

Create (POST):

curl -X POST http://localhost:8000/api/articles \
  -H "Content-Type: application/json" \
  -d '{"title":"Judul Artikel","content":"Isi artikel...","author":"Budi","tags":["php","laravel"]}'

Read All (GET):

curl http://localhost:8000/api/articles

Read One (GET):

curl http://localhost:8000/api/articles/ID_DARI_HASIL_CREATE

Update (PUT):

curl -X PUT http://localhost:8000/api/articles/ID \
  -H "Content-Type: application/json" \
  -d '{"title":"Judul Diubah"}'

Delete (DELETE):

curl -X DELETE http://localhost:8000/api/articles/ID

Query Builder MongoDB

Selain Eloquent, kalian juga bisa pakai Query Builder:

use Illuminate\Support\Facades\DB;

// Ambil semua dokumen
$articles = DB::connection('mongodb')->collection('articles')->get();

// Filter dengan where
$articles = DB::connection('mongodb')->collection('articles')
    ->where('author', 'Budi')
    ->where('tags', 'laravel')
    ->get();

// Order dan limit
$latest = DB::connection('mongodb')->collection('articles')
    ->orderBy('created_at', 'desc')
    ->limit(5)
    ->get();

// Count dokumen
$total = DB::connection('mongodb')->collection('articles')->count();

Kesimpulan

  • MongoDB adalah database NoSQL yang cocok untuk data fleksibel
  • Install package mongodb/laravel-mongodb (official) untuk integrasi dengan Laravel
  • Model untuk MongoDB extends MongoDB\Laravel\Eloquent\Model
  • CRUD dengan MongoDB sama mudahnya dengan MySQL
  • Pakai $casts untuk konversi tipe data otomatis

Pertanyaan yang Sering Diajukan

Apa syarat install MongoDB di PHP?

PHP harus punya ekstensi mongodb. Di Windows, tambahkan baris extension=php_mongodb.dll di php.ini. Di Linux/Unix, install via pecl install mongodb.

Perbedaan Eloquent Model biasa dengan Model MongoDB?

Model biasa extends Illuminate\Database\Eloquent\Model, sedangkan untuk MongoDB extends MongoDB\Laravel\Eloquent\Model. Package MongoDB official menyediakan semua method yang dibutuhkan.

Apakah bisa pakai MongoDB dan MySQL sekaligus di Laravel?

Bisa. Konfigurasi di config/database.php definisikan kedua koneksi, lalu saat membuat Model tentukan $connection. Untuk MongoDB pakai "mongodb", untuk MySQL pakai "mysql".

Bagaimana cara backup database MongoDB?

Dari terminal, jalankan mongodump --db=nama_database --out=./backup. Untuk restore, pakai mongorestore --db=nama_database ./backup/nama_database. Tool ini sudah include saat install MongoDB.

Sigit Nurhanafi avatar
Full-stack developer & technical writer. Berpengalaman di PHP, Laravel, NodeJS, MySQL, dan Python. Aktif menulis tutorial pemrograman dan maintaining open-source projects di PemburuKode sejak 2021.