Memuat...
👋 Selamat Pagi!

Panduan artisan schema show Alternatif untuk Dokumentasi Database Laravel

Laravel tidak punya artisan schema:show bawaan. Pelajari cara membuat sendiri dan tools alternatif terbaik untuk dokumentasi database tim yang efektif.

Panduan artisan schema show Alternatif untuk Dokumentasi Database Laravel

Bergabung ke project Laravel yang sudah berjalan tanpa dokumentasi database adalah mimpi buruk setiap developer.

Kamu mencoba memahami struktur tabel, mencari tahu relasi antar tabel, bahkan harus membuka migration file satu per satu hanya untuk tahu kolom apa saja yang ada.

Di framework lain seperti Rails, ada perintah rails dbconsole dan tools bawaan untuk inspeksi schema. Tapi Laravel? Tidak ada php artisan schema:show yang bisa langsung menampilkan struktur database.

Artikel ini akan membahas solusi praktis untuk masalah tersebut: cara membuat custom artisan command sendiri, package Laravel terbaik untuk dokumentasi database, dan strategi tim agar dokumentasi database tetap update.

Masalah Nyata Developer Laravel Tanpa Dokumentasi Database

Bayangkan kamu baru join ke tim development yang sudah menjalankan aplikasi Laravel selama 2 tahun.

Ada 50+ tabel di database. Migration file tersebar di berbagai folder. Beberapa kolom ditambahkan langsung lewat ALTER TABLE tanpa migration.

Pertanyaan yang muncul:

  • Tabel mana yang saling berelasi?
  • Kolom apa saja yang ada di tabel orders?
  • Index apa yang sudah dibuat?
  • Foreign key constraint-nya seperti apa?

Membuka phpMyAdmin atau TablePlus memang bisa, tapi tidak ideal untuk workflow development yang cepat.

Kamu butuh cara yang lebih developer-friendly: langsung dari terminal, terintegrasi dengan artisan command yang sudah familiar.

Apa yang Ada di Laravel Bawaan untuk Inspeksi Schema

Laravel sebenarnya punya beberapa cara untuk inspeksi database, tapi terbatas.

Migration Status

Perintah php artisan migrate:status menampilkan migration mana yang sudah dijalankan:

php artisan migrate:status

Output-nya menunjukkan batch number dan nama migration file. Tapi tidak menampilkan struktur tabel aktual.

Schema Facade

Laravel punya Schema facade untuk operasi database schema secara programmatic:

use Illuminate\Support\Facades\Schema;

$columns = Schema::getColumnListing('users');
// Returns: ['id', 'name', 'email', 'password', ...]

Tapi ini harus ditulis manual di controller atau tinker. Tidak praktis untuk inspeksi cepat.

Database Connection

Kamu bisa query information_schema langsung:

DB::select("SELECT * FROM information_schema.columns WHERE table_schema = 'your_db' AND table_name = 'users'");

Ribet dan tidak developer-friendly.

Jelas Laravel butuh solusi yang lebih baik.

Cara Membuat Artisan Command schema show Sendiri

Mari kita buat custom artisan command yang menampilkan struktur database seperti yang kamu inginkan.

Step 1: Generate Command File

php artisan make:command SchemaShowCommand

File baru akan dibuat di app/Console/Commands/SchemaShowCommand.php.

Step 2: Setup Command Signature

Edit file tersebut dan definisikan signature command:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;

class SchemaShowCommand extends Command
{
    protected $signature = 'schema:show {table?}';
    protected $description = 'Display database schema information';

    public function handle()
    {
        $table = $this->argument('table');
        
        if ($table) {
            $this->showTableSchema($table);
        } else {
            $this->showAllTables();
        }
    }
}

Parameter {table?} bersifat opsional. Jika tidak diisi, tampilkan semua tabel.

Step 3: Implementasi Method showAllTables

Method ini menampilkan daftar semua tabel di database:

protected function showAllTables()
{
    $tables = DB::select('SHOW TABLES');
    $dbName = DB::getDatabaseName();
    $key = "Tables_in_{$dbName}";
    
    $this->info("Database: {$dbName}");
    $this->newLine();
    
    $tableData = [];
    
    foreach ($tables as $table) {
        $tableName = $table->$key;
        $rowCount = DB::table($tableName)->count();
        
        $tableData[] = [
            $tableName,
            $rowCount,
            $this->getTableSize($tableName)
        ];
    }
    
    $this->table(
        ['Table', 'Rows', 'Size'],
        $tableData
    );
}

protected function getTableSize($table)
{
    $result = DB::select("
        SELECT 
            ROUND(((data_length + index_length) / 1024 / 1024), 2) AS size_mb
        FROM information_schema.TABLES 
        WHERE table_schema = DATABASE()
        AND table_name = ?
    ", [$table]);
    
    return ($result[0]->size_mb ?? 0) . ' MB';
}

Output-nya akan seperti ini:

Database: laravel_app

+------------------+-------+---------+
| Table            | Rows  | Size    |
+------------------+-------+---------+
| users            | 1250  | 2.45 MB |
| orders           | 8430  | 15.2 MB |
| products         | 450   | 1.10 MB |
+------------------+-------+---------+

Step 4: Implementasi Method showTableSchema

Method ini menampilkan detail kolom dari satu tabel:

protected function showTableSchema($table)
{
    if (!Schema::hasTable($table)) {
        $this->error("Table '{$table}' does not exist.");
        return;
    }
    
    $this->info("Table: {$table}");
    $this->newLine();
    
    $columns = DB::select("
        SELECT 
            COLUMN_NAME,
            COLUMN_TYPE,
            IS_NULLABLE,
            COLUMN_KEY,
            COLUMN_DEFAULT,
            EXTRA
        FROM information_schema.COLUMNS
        WHERE TABLE_SCHEMA = DATABASE()
        AND TABLE_NAME = ?
        ORDER BY ORDINAL_POSITION
    ", [$table]);
    
    $columnData = [];
    
    foreach ($columns as $column) {
        $columnData[] = [
            $column->COLUMN_NAME,
            $column->COLUMN_TYPE,
            $column->IS_NULLABLE === 'YES' ? 'NULL' : 'NOT NULL',
            $column->COLUMN_KEY ?: '-',
            $column->COLUMN_DEFAULT ?? '-',
            $column->EXTRA ?: '-'
        ];
    }
    
    $this->table(
        ['Column', 'Type', 'Null', 'Key', 'Default', 'Extra'],
        $columnData
    );
    
    $this->showIndexes($table);
    $this->showForeignKeys($table);
}

Step 5: Tampilkan Index dan Foreign Keys

protected function showIndexes($table)
{
    $indexes = DB::select("SHOW INDEXES FROM {$table}");
    
    if (empty($indexes)) {
        return;
    }
    
    $this->newLine();
    $this->info("Indexes:");
    
    $indexData = [];
    $processedIndexes = [];
    
    foreach ($indexes as $index) {
        if (in_array($index->Key_name, $processedIndexes)) {
            continue;
        }
        
        $indexData[] = [
            $index->Key_name,
            $index->Non_unique ? 'NO' : 'YES',
            $index->Column_name
        ];
        
        $processedIndexes[] = $index->Key_name;
    }
    
    $this->table(
        ['Name', 'Unique', 'Column'],
        $indexData
    );
}

protected function showForeignKeys($table)
{
    $foreignKeys = DB::select("
        SELECT 
            CONSTRAINT_NAME,
            COLUMN_NAME,
            REFERENCED_TABLE_NAME,
            REFERENCED_COLUMN_NAME
        FROM information_schema.KEY_COLUMN_USAGE
        WHERE TABLE_SCHEMA = DATABASE()
        AND TABLE_NAME = ?
        AND REFERENCED_TABLE_NAME IS NOT NULL
    ", [$table]);
    
    if (empty($foreignKeys)) {
        return;
    }
    
    $this->newLine();
    $this->info("Foreign Keys:");
    
    $fkData = [];
    
    foreach ($foreignKeys as $fk) {
        $fkData[] = [
            $fk->CONSTRAINT_NAME,
            $fk->COLUMN_NAME,
            $fk->REFERENCED_TABLE_NAME . '(' . $fk->REFERENCED_COLUMN_NAME . ')'
        ];
    }
    
    $this->table(
        ['Constraint', 'Column', 'References'],
        $fkData
    );
}

Cara Pakai:

# Tampilkan semua tabel
php artisan schema:show

# Tampilkan detail tabel users
php artisan schema:show users

# Tampilkan detail tabel orders
php artisan schema:show orders

Output detail tabel:

Table: users

+------------+------------------+----------+-----+---------+-------------------+
| Column     | Type             | Null     | Key | Default | Extra             |
+------------+------------------+----------+-----+---------+-------------------+
| id         | bigint unsigned  | NOT NULL | PRI | -       | auto_increment    |
| name       | varchar(255)     | NOT NULL | -   | -       | -                 |
| email      | varchar(255)     | NOT NULL | UNI | -       | -                 |
| password   | varchar(255)     | NOT NULL | -   | -       | -                 |
| created_at | timestamp        | NULL     | -   | -       | -                 |
+------------+------------------+----------+-----+---------+-------------------+

Indexes:
+--------------+--------+--------+
| Name         | Unique | Column |
+--------------+--------+--------+
| PRIMARY      | YES    | id     |
| users_email  | YES    | email  |
+--------------+--------+--------+

Command ini sudah cukup powerful untuk inspeksi database sehari-hari.

Kesulitan dengan tugas programming atau butuh bantuan coding? KerjaKode siap membantu menyelesaikan tugas IT dan teknik informatika Anda. Dapatkan bantuan profesional di jasa tugas IT KerjaKode.

Alternatif Package Laravel Schema Viewer dan ERD Generator

Selain membuat command sendiri, ada beberapa package Laravel yang sudah mature untuk dokumentasi database.

1. Laravel Debugbar

Package barryvdh/laravel-debugbar punya tab Database yang menampilkan query dan struktur tabel.

Install:

composer require barryvdh/laravel-debugbar --dev

Setelah install, akses aplikasi Laravel kamu di browser. Debugbar akan muncul di bagian bawah dengan tab Database yang menampilkan semua query.

Kelebihan:

  • Terintegrasi dengan development workflow
  • Menampilkan query history dan execution time
  • Bisa inspect query parameter

Kekurangan:

  • Hanya bisa diakses lewat browser, bukan terminal
  • Tidak menampilkan ERD atau relasi visual

2. Laravel ER Diagram Generator

Package beyondcode/laravel-er-diagram-generator menghasilkan ERD dalam format Graphviz.

Install:

composer require beyondcode/laravel-er-diagram-generator --dev

Generate diagram:

php artisan generate:erd output.png

Output berupa file PNG yang menampilkan relasi antar tabel secara visual.

Kelebihan:

  • Visual representation yang jelas
  • Otomatis detect foreign key relationships
  • Support custom output format (PNG, SVG, PDF)

Kekurangan:

  • Butuh Graphviz installed di server
  • Tidak interactive, hanya static image

3. Laravel Schema Rules

Package laravie/schema menyediakan helper untuk inspeksi database schema secara programmatic.

Install:

composer require laravie/schema

Usage:

use Laravie\Schema\Schema;

$tables = Schema::tables();
$columns = Schema::columns('users');

Kelebihan:

  • API yang clean dan Laravel-style
  • Bisa diintegrasikan ke custom command atau test

Kekurangan:

  • Tidak ada CLI command bawaan
  • Harus coding manual untuk output

4. Laravel Schema Spy

Package mtolhuys/laravel-schema-spy adalah tools paling lengkap untuk inspeksi database Laravel.

Install:

composer require mtolhuys/laravel-schema-spy --dev

Publish config:

php artisan vendor:publish --provider="Mtolhuys\LaravelSchemaSpy\SchemaSpyServiceProvider"

Generate documentation:

php artisan schema:spy

Output berupa HTML documentation yang bisa dibuka di browser.

Kelebihan:

  • Generate HTML documentation yang comprehensive
  • Menampilkan table size, row count, indexes, foreign keys
  • Bisa export ke berbagai format

Kekurangan:

  • Setup awal agak kompleks
  • File output besar jika database banyak tabel

Rekomendasi Terbaik

Untuk inspeksi cepat di terminal: buat custom command seperti yang sudah dijelaskan di atas.

Untuk dokumentasi tim yang persistent: gunakan beyondcode/laravel-er-diagram-generator atau mtolhuys/laravel-schema-spy.

Untuk debugging query di development: gunakan barryvdh/laravel-debugbar.

Tips Dokumentasi Database yang Bertahan Lama untuk Tim Remote

Custom command dan package memang membantu, tapi dokumentasi database tetap harus dijaga agar tidak outdated.

1. Migration Wajib Disertai Comment

Setiap migration file harus punya comment yang jelas:

Schema::create('orders', function (Blueprint $table) {
    $table->id();
    $table->foreignId('user_id')->constrained(); // FK ke users table
    $table->string('order_number')->unique()->comment('Format: ORD-YYYYMMDD-XXX');
    $table->decimal('total_amount', 10, 2)->comment('Total setelah diskon');
    $table->enum('status', ['pending', 'paid', 'shipped', 'completed'])->default('pending');
    $table->timestamps();
});

Comment ini akan muncul di database schema dan bisa dibaca oleh tools documentation.

2. Buat README.md untuk Database Schema

Buat file docs/database.md yang menjelaskan high-level architecture:

# Database Schema

## Core Tables

### users
Menyimpan data user aplikasi (customer dan admin).

Foreign Keys:
- Tidak ada

Related Tables:
- orders (one-to-many)
- addresses (one-to-many)

### orders
Menyimpan data transaksi pembelian.

Foreign Keys:
- user_id -> users.id

Related Tables:
- order_items (one-to-many)
- payments (one-to-one)

File ini jadi single source of truth untuk developer baru.

3. Gunakan Database Documentation Generator

Integrate documentation generator ke CI/CD pipeline:

# .github/workflows/docs.yml
name: Generate Database Docs

on:
  push:
    branches: [main]
    paths:
      - 'database/migrations/**'

jobs:
  generate-docs:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup PHP
        uses: shivammathur/setup-php@v2
      - name: Install Dependencies
        run: composer install
      - name: Generate ERD
        run: php artisan generate:erd docs/erd.png
      - name: Commit Documentation
        run: |
          git config user.name "GitHub Actions"
          git add docs/erd.png
          git commit -m "Update database documentation"
          git push

Setiap kali ada perubahan migration, dokumentasi otomatis ter-update.

4. Code Review untuk Migration

Jangan approve PR yang mengubah database tanpa:

  • Migration file yang clear
  • Comment di kolom penting
  • Update dokumentasi jika ada perubahan struktur signifikan

5. Seed Data untuk Development

Buat seeder yang representatif agar developer baru bisa langsung testing:

php artisan db:seed --class=DevelopmentSeeder

Seeder ini harus mencakup:

  • Sample users dengan berbagai role
  • Sample orders dengan berbagai status
  • Sample products dengan kategori lengkap

Developer baru bisa langsung lihat data flow tanpa harus input manual.

6. Database Migration Testing

Pastikan migration bisa rollback dengan benar:

php artisan migrate:fresh
php artisan migrate
php artisan migrate:rollback
php artisan migrate

Test ini harus pass sebelum merge ke main branch.

7. Dokumentasi Foreign Key Cascade Behavior

Jika ada foreign key dengan cascade delete atau update, dokumentasikan dengan jelas:

$table->foreignId('user_id')
    ->constrained()
    ->onDelete('cascade') // HATI-HATI: Delete user akan delete semua orders
    ->comment('FK to users - CASCADE DELETE');

Behavior ini harus dijelaskan di docs atau di comment migration.

Kesimpulan

Laravel memang tidak punya artisan schema:show bawaan, tapi solusinya ada banyak.

Kamu bisa membuat custom command sendiri dengan effort minimal, atau menggunakan package yang sudah mature.

Yang paling penting: dokumentasi database harus jadi bagian dari workflow development, bukan afterthought.

Tim yang punya dokumentasi database yang baik akan:

  • Onboarding developer baru lebih cepat
  • Mengurangi bug akibat misunderstanding struktur data
  • Code review lebih efektif
  • Scaling aplikasi lebih mudah

Mulai dari sekarang, jadikan dokumentasi database sebagai prioritas dalam project Laravel kamu.

Custom command schema:show yang kita buat tadi bisa jadi starting point yang baik. Tinggal sesuaikan dengan kebutuhan tim.

Selamat mendokumentasikan database!

Ajie Kusumadhany
Written by

Ajie Kusumadhany

Founder & Lead Developer KerjaKode. Berpengalaman dalam pengembangan web modern dengan Laravel, React.js, Vue.js, dan teknologi terkini. Passionate tentang coding, teknologi, dan berbagi pengetahuan melalui artikel.

Promo Spesial Hari Ini!

10% DISKON

Promo berakhir dalam:

00 Jam
:
00 Menit
:
00 Detik
Klaim Promo Sekarang!

*Promo berlaku untuk order hari ini

0
User Online
Halo! 👋
Kerjakode Support Online
×

👋 Hai! Pilih layanan yang kamu butuhkan:

Chat WhatsApp Sekarang