Collections Tabel Data

Dalam pengembangan plugin NocoBase, Collection (Tabel Data) adalah salah satu konsep paling inti. Anda dapat menambah atau memodifikasi struktur tabel data dalam plugin dengan mendefinisikan atau memperluas Collection. Berbeda dengan tabel data yang dibuat melalui antarmuka "Manajemen Data Source", Collection yang didefinisikan dengan kode biasanya merupakan tabel metadata level sistem, tidak akan muncul di daftar manajemen data source.

Mendefinisikan Tabel Data

Sesuai dengan struktur direktori konvensi, file Collection harus diletakkan di direktori ./src/server/collections. Membuat tabel baru menggunakan defineCollection(), memperluas tabel yang ada menggunakan extendCollection().

import { defineCollection } from '@nocobase/database';

export default defineCollection({
  name: 'articles',
  title: 'Contoh Artikel',
  fields: [
    { type: 'string', name: 'title', interface: 'input', uiSchema: { title: 'Judul', required: true } },
    { type: 'text', name: 'content', interface: 'textarea', uiSchema: { title: 'Konten' } },
    {
      type: 'belongsTo',
      name: 'author',
      target: 'users',
      foreignKey: 'authorId',
      interface: 'recordPicker',
      uiSchema: { title: 'Penulis' },
    },
  ],
});

Pada contoh di atas:

  • name: Nama tabel (akan otomatis menghasilkan tabel dengan nama yang sama di database).
  • title: Nama tampilan tabel di antarmuka.
  • fields: Kumpulan field, setiap field berisi property type, name, dan lainnya.

Saat perlu menambahkan field atau memodifikasi konfigurasi untuk Collection plugin lain, dapat menggunakan extendCollection():

import { extendCollection } from '@nocobase/database';

export default extendCollection({
  name: 'articles',
  fields: [
    {
      type: 'boolean',
      name: 'isPublished',
      defaultValue: false,
    },
  ],
});

Setelah plugin diaktifkan, sistem akan secara otomatis menambahkan field isPublished ke tabel articles yang sudah ada.

Tips

Direktori konvensi akan selesai dimuat sebelum method load() semua plugin dieksekusi, sehingga menghindari masalah dependensi yang disebabkan oleh sebagian tabel data yang belum dimuat.

Cheatsheet Tipe Field

Pada fields defineCollection, type menentukan tipe kolom field di database. Berikut adalah semua tipe field bawaan:

Teks

typeTipe DatabasePenjelasanParameter Khusus
stringVARCHAR(255)Teks pendeklength?: number (custom length), trim?: boolean
textTEXTTeks panjanglength?: 'tiny' | 'medium' | 'long' (hanya MySQL)

Angka

typeTipe DatabasePenjelasanParameter Khusus
integerINTEGERBilangan bulat
bigIntBIGINTBilangan bulat besar
floatFLOATBilangan floating point
doubleDOUBLEFloating point presisi ganda
decimalDECIMAL(p,s)Bilangan fixed pointprecision: number, scale: number

Boolean

typeTipe DatabasePenjelasan
booleanBOOLEANNilai boolean

Tanggal Waktu

typeTipe DatabasePenjelasanParameter Khusus
dateDATE(3)Tanggal waktu (dengan milidetik)defaultToCurrentTime?, onUpdateToCurrentTime?
dateOnlyDATEONLYHanya tanggal, tanpa waktu
timeTIMEHanya waktu
unixTimestampBIGINTUnix timestampaccuracy?: 'second' | 'millisecond'
Tips

date adalah tipe tanggal yang paling sering digunakan. Jika perlu membedakan cara penanganan zona waktu, juga tersedia datetimeTz (dengan zona waktu) dan datetimeNoTz (tanpa zona waktu).

Data Terstruktur

typeTipe DatabasePenjelasanParameter Khusus
jsonJSON / JSONBData JSONjsonb?: boolean (Gunakan JSONB di PostgreSQL)
jsonbJSONB / JSONPrioritaskan menggunakan JSONB
arrayARRAY / JSONArrayDi PostgreSQL dapat menggunakan tipe ARRAY native

Generasi ID

typeTipe DatabasePenjelasanParameter Khusus
uidVARCHAR(255)Otomatis menghasilkan ID pendekprefix?: string
uuidUUIDUUID v4autoFill?: boolean (default true)
nanoidVARCHAR(255)NanoIDsize?: number (default 12), customAlphabet?: string
snowflakeIdBIGINTSnowflake IDautoFill?: boolean (default true)

Tipe Khusus

typeTipe DatabasePenjelasan
passwordVARCHAR(255)Penyimpanan hash dengan salt otomatis
virtualTanpa kolom aktualField virtual, tidak membuat kolom di database
contextDapat dikonfigurasiOtomatis terisi dari konteks request (misalnya currentUser.id)

Tipe Asosiasi

Field asosiasi tidak membuat kolom database, tetapi membangun relasi antar tabel di layer ORM:

typePenjelasanParameter Kunci
belongsToMany-to-onetarget (tabel target), foreignKey (field foreign key)
hasOneOne-to-onetarget, foreignKey
hasManyOne-to-manytarget, foreignKey
belongsToManyMany-to-manytarget, through (tabel perantara), foreignKey, otherKey

Contoh penggunaan field asosiasi:

export default defineCollection({
  name: 'articles',
  fields: [
    { type: 'string', name: 'title' },
    // Many-to-one: Artikel milik satu penulis
    {
      type: 'belongsTo',
      name: 'author',
      target: 'users',
      foreignKey: 'authorId',
    },
    // One-to-many: Artikel memiliki banyak komentar
    {
      type: 'hasMany',
      name: 'comments',
      target: 'comments',
      foreignKey: 'articleId',
    },
    // Many-to-many: Artikel memiliki banyak tag
    {
      type: 'belongsToMany',
      name: 'tags',
      target: 'tags',
      through: 'articlesTags',  // Nama tabel perantara
    },
  ],
});

Parameter Umum

Semua field kolom mendukung parameter berikut:

ParameterTipePenjelasan
namestringNama field (wajib)
defaultValueanyNilai default
allowNullbooleanApakah mengizinkan null
uniquebooleanApakah unik
primaryKeybooleanApakah primary key
autoIncrementbooleanApakah auto increment
indexbooleanApakah membuat index
commentstringKomentar field

Sinkronisasi Struktur Database

Saat plugin pertama kali diaktifkan, sistem akan secara otomatis menyinkronkan konfigurasi Collection dengan struktur database. Jika plugin sudah terinstal dan sedang berjalan, setelah menambah atau memodifikasi Collection perlu menjalankan command upgrade secara manual:

yarn nocobase upgrade

Jika terjadi exception atau data kotor selama proses sinkronisasi, dapat membangun ulang struktur tabel dengan menginstal ulang aplikasi:

yarn nocobase install -f

Jika upgrade plugin perlu melakukan migrasi pada data yang ada — seperti rename field, split tabel, mengisi nilai default, dll. — harus ditangani melalui Migration Skrip Upgrade, bukan dengan mengubah database secara manual.

Membuat Collection Muncul di Daftar Tabel Data UI

Tabel yang didefinisikan melalui defineCollection adalah tabel internal server, secara default tidak akan muncul di daftar "Manajemen Data Source", juga tidak akan muncul di daftar pemilihan tabel data saat "Menambahkan Block".

Cara yang Direkomendasikan: Tambahkan tabel data yang sesuai di "Manajemen Data Source" di antarmuka NocoBase, setelah konfigurasi field dan tipe interface, tabel akan otomatis muncul di daftar pemilihan tabel data Block.

Memilih sendiri saat menambahkan Block

Jika memang perlu didaftarkan dalam kode plugin (seperti skenario demo dalam plugin contoh), dapat mendaftarkan secara manual melalui addCollection dalam plugin client. Perhatikan harus didaftarkan melalui mode eventBus, tidak boleh dipanggil langsung di load()ensureLoaded() akan membersihkan dan mengatur ulang semua collection setelah load(). Untuk contoh lengkap lihat Membuat Plugin Manajemen Data Front-Back End.

Resource yang Dihasilkan Otomatis

Setelah mendefinisikan Collection, NocoBase akan otomatis menghasilkan resource REST API yang sesuai untuknya, API CRUD yang siap pakai (list, get, create, update, destroy) tidak perlu ditulis tambahan. Jika operasi CRUD bawaan tidak cukup — misalnya Anda memerlukan API "import batch" atau "ringkasan statistik" — dapat mendaftarkan action kustom melalui resourceManager. Lihat ResourceManager Manajemen Resource.

Tautan Terkait