Relasi

Relasi menyatakan potensi koneksi antara record dalam model Cloud SQL. Relasi merepresentasikan kemampuan suatu record untuk dikaitkan dengan satu atau beberapa record lainnya. Misalnya, model Person di aplikasi sosial dapat memiliki relasi Friends yang merepresentasikan pertemanan antara dua orang.

Dasar-dasar relasi

Relasi di App Maker bersifat dua arah. Setiap arah disebut tepi relasi, dan setiap tepi relasi memiliki dua properti:

  • Name—Nama tepi relasi, digunakan untuk merujuk pada relasi dalam data binding dan skrip.
  • Count—Jumlah koneksi yang didukung tepi relasi. Jumlah ini dapat ditetapkan ke satu, yang berarti record hanya menerima satu koneksi, atau banyak, yang berarti record menerima koneksi tanpa batas. Relasi bisa bernilai one-to-one, one-to-many, dan many-to-many. Nilai count-to-count disebut kardinalitas atau derajat hubungan.

Misalnya, aplikasi SDM dapat menggunakan relasi antara model EmployeeDB dan Teams untuk mewakili karyawan dan timnya. Anda dapat membuat relasi many-to-many antara EmployeeDB dan Teams karena setiap karyawan dapat menjadi anggota dari banyak tim. Tepi relasinya memiliki properti berikut:

  • Name=Members, Count=Many
  • Name=Teams, Count=Many

Anda juga dapat membuat relasi one-to-many antara EmployeeDB dan Teams karena setiap tim dapat memiliki satu manajer dan manajer dapat memiliki beberapa tim. Tepi relasinya memiliki properti berikut:

  • Name=Manager, Count=One
  • Name=Teams, Count=Many

Membuat dan mengedit relasi

Untuk membuat relasi:

  1. Klik model Cloud SQL dan buka tab Relasi.
  2. Untuk membuat relasi, klik Tambahkan Relasi. Gunakan wizard pembuatan untuk:

    1. Menetapkan model target untuk tepi relasi lainnya.
    2. Memilih jumlah untuk setiap tepi relasi.
    3. (Opsional) Memasukkan nama untuk setiap tepi relasi jika Anda tidak ingin tetap menggunakan nilai defaultnya.
    4. (Opsional) Memilih Pemilik untuk tepi relasi dengan jumlah satu, bagi relasi one-to-one dan one-to-many. Tentukan model Pemilik dalam relasi hanya jika:
  3. Klik Buat.

Setelah membuat relasi, Anda dapat mengedit nama tepi relasi. Untuk tepi relasi dengan jumlah satu, Anda dapat mengaktifkan atau menonaktifkan kepemilikan. Untuk tepi relasi dengan jumlah banyak, Anda dapat mengubah urutannya.

Untuk mengedit relasi:

  1. Klik model dan buka tab Relasi.
  2. Dalam daftar relasi, klik nama tepi relasi.

    Untuk relasi yang menghubungkan record dalam dua model, daftar relasi untuk setiap model hanya menampilkan nama tepi relasi dari model yang berlawanan. Untuk relasi yang menghubungkan record dalam model yang sama, kedua tepi relasi akan tercantum. Dalam contoh model EmployeeDB, baik Manager maupun Members dicantumkan pada tab Relasi.

  3. Edit nama, pemilik, atau urutannya. Perubahan Anda disimpan secara otomatis.

    Untuk menetapkan urutan, pilih kolom mana yang akan digunakan untuk mengurutkan record. Pilih kotak centang Menaik untuk menetapkan urutan record tepi relasi. Jika Anda tidak menentukan preferensi urutannya, backend data model yang akan menentukan urutannya.

Kepemilikan record terkait

Untuk relasi yang memiliki setidaknya satu tepi relasi dengan jumlah satu, Anda dapat menentukan Pemilik, sesuai dengan beberapa aturan. Saat menetapkan pemilik, Anda dapat membuat hubungan yang dimiliki pemilik untuk record terkait dalam dua model:

  • Dengan kepemilikan—Ketika pengguna atau logika aplikasi menghapus record dari model pemilik, aplikasi menghapus semua record terkait yang dimiliki. Ketika record yang dimiliki dihapus, record pemilik tidak akan dihapus.
  • Tanpa kepemilikan—Ketika record di kedua tepi relasi dihapus, tidak ada record yang dihapus di tepi lainnya.

Cukup tentukan model pemilik dalam relasi jika kondisi berikut bernilai true:

  • Record yang dimiliki harus ada bersama record pemiliknya
  • Anda ingin record di tepi relasi yang dimiliki dihapus secara otomatis ketika record pemilik dihapus.

Contoh kepemilikan

Anda mungkin ingin menghapus item invoice ketika invoice dihapus. Dengan relasi one-to-many antara model Invoice dan Item, buat model Invoice sebagai pemiliknya. Saat pengguna menghapus record Invoice, aplikasi juga menghapus semua record Item yang dimiliki, yaitu record yang dikaitkan dengan record Invoice yang dihapus.

Perhatikan bahwa record yang dihapus adalah instance item tertentu, seperti drive disk tertentu dari inventaris, bukan kategori item, seperti jenis drive disk yang Anda miliki.

Aturan kepemilikan

  • Hanya model di satu sisi relasi one-to-one atau one-to-many yang dapat menjadi pemilik.
  • Anda tidak dapat menetapkan model sebagai pemilik jika tindakan tersebut akan membuat siklus kepemilikan, seperti record A memiliki record B dan record B memiliki record A.
  • Anda dapat merangkai relasi yang dimiliki pemilik. Misalnya, jika Anda memiliki model dan relasi berikut:

    • Model Forum, Topic, dan Comment
    • Relasi one-to-many dari Forum ke Topic, dengan model Forum sebagai pemiliknya
    • Relasi one-to-many dari Topic ke Comment, dengan model Topic sebagai pemiliknya

    Saat Anda menghapus record Topic, App Maker juga akan menghapus semua record Comment terkait. Saat Anda menghapus record Forum, App Maker juga akan menghapus semua record Topic terkait dan record Comment terkait.

  • Model dengan banyak relasi dapat dimiliki oleh banyak model Pemilik.

  • Saat Anda menghapus record dari model Pemilik, App Maker akan menghapus record yang dimiliki record tersebut dari model lain, meskipun record juga dimiliki oleh record dalam model lain.

Mengelola pengaitan antar-record

Pengaitan adalah hubungan aktual antara dua record melalui relasi model. Misalnya, jika Anda memiliki relasi one-to-many antara tepi relasi Manager dan Teams, ada pengaitan antar-record untuk Manager1 dan record untuk setiap tim.

Anda dapat membuat dan mengubah pengaitan antar-record dalam tiga cara, bergantung pada alur kerja aplikasi Anda:

  1. Gunakan data binding untuk mengaktifkan tampilan widget atau mengubah pengaitan record.
  2. Gunakan skrip klien untuk menangani perubahan pengaitan yang lebih rumit daripada yang dapat dilakukan data binding.
  3. Gunakan skrip server untuk menangani perubahan massal atau membuat perubahan dengan aman.

Mengubah pengaitan dengan data binding

Ada banyak cara untuk mengubah pengaitan antar-record melalui data binding, tetapi cara paling mudah adalah dengan mengakses tepi relasi sebagai properti dari item sumber data model. Dalam sumber data model, tepi relasi diekspos sebagai properti record, seperti kolom.

Untuk mengaktifkan tampilan widget atau mengubah record terkait untuk record yang saat ini dipilih, ikat value widget ke @datasource.item.[relation end name]. Metode ini sangat berguna untuk widget drop-down (jika tepi relasi berjumlah satu) dan kotak dengan banyak pilihan (jika tepi relasi berjumlah banyak). Untuk mengetahui contohnya, simak Tutorial menghubungkan model data; saat Anda membuat elemen UI untuk membuat daftar karyawan, Anda dapat menyiapkan binding antara nilai widget dan sumber data.

Mengubah pengaitan dengan skrip klien

Pendekatan ini lebih sulit daripada data binding karena Anda perlu memastikan bahwa sumber data telah memuat record terkait dari suatu record. Anda dapat memastikan bahwa record terkait dimuat dengan cara berikut:

  • Aktifkan prefetch untuk sumber data
  • Panggil _loadRelation-name pada record dan tunggu callback yang tidak bersamaan
  • Tunggu peristiwa onLoad dari sumber data relasi
  • Tunggu peristiwa onDataLoad dari widget yang menggunakan sumber data relasi

Misalnya, untuk membuat skenario relasi EmployeeDB-Team dari contoh sebelumnya, Anda dapat menggunakan kode berikut untuk mengaitkan record (tetapkan seorang manajer ke anggota tim dan tambahkan anggota tim ke tim manajer). Untuk mempermudah Anda dalam mengakses record karyawan yang benar, buat dua sumber data dalam model EmployeeDB:

  1. Manager, yang memungkinkan Anda memilih manajer
  2. Member, yang memungkinkan Anda memilih anggota tim
    var managerRecord = app.datasources.Manager.item;
    var teamRecord = app.datasources.Teams.item;

    // Assign the manager to the team.
    teamRecord.Manager = managerRecord;

    // Changes are saved automatically if the datasource in auto-save mode

    // Add a team member to a Manager's team.
    // Note: Retrieve Members on the client before proceeding, such as by using prefetch option in datasource - datasources Team -> Members)
    var engineerRecord = app.datasources.TeamMember.item;
    teamRecord.Members.push(engineerRecord);

Mengubah pengaitan dengan skrip server

Pengaitan dalam skrip server lebih mudah diubah daripada pengaitan dalam skrip klien karena Anda tidak perlu khawatir ketika record terkait dimuat. Akses record yang sesuai, lalu gunakan properti tepi relasinya untuk mengaitkan record melalui relasi.

Misalnya, untuk membuat skenario relasi EmployeeDB-Team dari contoh sebelumnya, Anda dapat menambahkan manajer dan anggota ke tim dengan skrip server berikut:

// Get the record for the Team to modify.
var teamRecord = app.models.Teams.getRecord("team1");

// Assign a manager to the Team.
var managerRecord = app.models.EmployeeDB.getRecord("manager1");
teamRecord.Manager = managerRecord;

// Note: The new association is not saved yet

// Assign a team member to the Team.
var engineerRecord = app.models.EmployeeDB.getRecord("engineer1");
teamRecord.Members.push(engineerRecord);

// Save both changes to the database.
app.saveRecords([teamRecord]);

Pemfilteran relasi

Untuk memfilter atau mengurutkan record berdasarkan kolom dalam model Cloud SQL terkait, tambahkan nama relasi yang diikuti oleh nama kolom. Misalnya, untuk memfilter relasi Mother berdasarkan kolom Age record yang terkait, gunakan Mother.Age.

Anda juga dapat menerapkan filter equals, notEquals, in, dan notIn pada record terkait atau kunci record. Misalnya, untuk memeriksa apakah seorang manajer dari manajer ditetapkan dengan benar, Anda dapat memfilter berdasarkan Manager.Manager._key._equals.

Pemfilteran relasi tersedia dalam data binding dan pembuatan skrip server.

Referensi lebih lanjut