D
Engineering

Database

MongoDB sebagai database utama dengan 4 koneksi, tanpa migration sebagai acuan skema, dan pola seeder untuk perubahan struktur data.

Database utama dazoapp adalah MongoDB, bukan MySQL. Asumsi umum Laravel (Eloquent + migration) sebagian besar salah di sini.

Koneksi

Ada 4 koneksi terdaftar di config/database.php:

KoneksiDriverKegunaan
mongodbMongoDBDefault. 77 dari 79 model
crmMongoDBDatabase CRM terpisah (nonaktif — tidak dipakai)
covendorMongoDBData vendor
mysqlMySQLHanya 2 model: UserAspire, UserRole

Model — MongoDB vs Eloquent

77 model memakai MongoDB\Laravel\Eloquent\Model:

php
use MongoDB\Laravel\Eloquent\Model;  // BENAR — bukan Illuminate\Database\Eloquent\Model

class Order extends Model
{
    // ...
}

Hanya 2 model yang memakai Eloquent MySQL:

  • app/Models/UserAspire.php
  • app/Models/UserRole.php

Tidak ada migration sebagai acuan skema

Direktori database/migrations/ hanya berisi 7 file warisan Laravel (users, sessions, jobs, dll). Ini bukan acuan struktur data.

Karena MongoDB schemaless, struktur koleksi tidak terversi. Bentuk sebuah dokumen hanya bisa diketahui dengan:

  1. Membaca controller yang menulisnya
  2. Membaca seeder terkait
  3. Query langsung ke database

Pola seeder untuk perubahan struktur

Perubahan bentuk data dilakukan lewat seeder, bukan migration. Contoh: database/seeders/BackfillWalletFieldsSeeder.php.

bash
php artisan db:seed --class=BackfillWalletFieldsSeeder

Primary key — UUID string

Seluruh model MongoDB memakai UUID string sebagai primary key, di-generate di boot():

php
public $incrementing = false;
protected $keyType = 'string';
protected $primaryKey = 'id';

protected static function boot()
{
    parent::boot();
    static::creating(fn($model) => $model->id = (string) Str::uuid());
}

Ini berlaku untuk semua model MongoDB. Jangan asumsikan id adalah integer auto-increment.

Relasi

Contoh dari app/Models/Order.php:

php
public function product()
{
    return $this->belongsTo('App\Models\Product', 'product_id', 'id');
}

public function customer()
{
    return $this->hasOne('App\Models\Customer', 'id', 'customer_id');
}

public function order_item()
{
    return $this->hasMany('App\Models\OrderItem', 'order_id', 'id');
}

Helper global

app/Helpers/helpers.php di-autoload via composer.json "files". Berisi fungsi global seperti generateUUIDv4(), findPermissionByName(), getDomainList(). Tidak perlu import untuk memakai.

Jangan berasumsi bentuk data

Jika bentuk dokumen MongoDB tidak jelas, katakan — jangan menebak. Baca controller yang menulisnya + seeder terkait sebelum menulis query baru.

79 model — daftar singkat

KategoriContoh model
Order & PaymentOrder, OrderItem, OrderPayment, Wallet, WalletTransaction, SubscriptionPayment, SubscriptionInvoice, Expense
Produk & InventoryProduct, ProductVariant, Variation, Stock, ItemProduct, Category, Collection
Customer & KontakCustomer, Tag, Segment, CrmWorkspace (nonaktif), CrmUser (nonaktif)
WhatsAppDevice, Agent, ChatList, ChatHistory, ChatOrder, ChatCheckout, Chatbot
BroadcastBroadcastSceduler, BroadcastMessage, BroadcastLog
Digital StoreDigitalStore, DigitalStorePage, PreviewDigitalStore, DraftStoresDigital
MarketingBiolink, CustomDomain, Domain, Pixel, Conversion, RegistrationLink
ShippingProvince, City, Subdistrict, Warehouse, HandleGudang, Bank, BankPayment
Team & SettingUser, UserStore, UserRole, UserAspire, Store, Setting, Package
AI AgentAgent, AgentTestingInbox, ResponseTemplate, TemplateMessage, Flow
LainNotification, LoginLog, Log, LogRequestOpenai, EmailVerification, WaVerification, WellcomeMessage, CodeTelp, Kupon, Coupon, TicketingFeedback, PlatformSetting, VendorUser, TeamchatInbox

Langkah berikutnya

  • Akan menulis query? Wajib baca Multi-tenantstore_id scoping.
  • Butuh auth? Baca Auth & JWT — JWT adalah kontrak lintas-service.