Panada Framework 1.0.0 Documentation

Active Record

Panada mengikuti pattern Active Record sebagaimana yang terdapat di http://en.wikipedia.org/wiki/Active_record_pattern. Setiap nama tabel diwakili oleh sebuah class dan setiap properties class mewakili nama kolom.

Panada Active Record saat ini support terhadap DBMS:

  • MySQL
  • PostgreSQL
  • SQLite
  • Cubrid

Inisialisasi

Untuk menggunakan Active Record pastikan konfigurasi koneksi ke database sudah benar. Untuk detail panduan koneksi database, silahkan klik di halaman configuration.

Class Model

Untuk menggunakan Active Record Anda harus membuat sebuah class model yang di extend ke class Resources\ActiveRecord. Setiap class yang dibuat mewakili sebuah tabel yang ada di database. Berikut adalah contoh model dari tabel users:

Nama Tabel

Secara default, nama tabel yang akan digunakan mengikuti nama class model. Sebagai contoh jika nama classnya adalah Users, maka nama tabel yang diwakili adalah users dan jika nama modelnya adalah Comments maka class ini mewakili tabel comments.

Namun Anda juga bisa menentukan nama lain yang tidak sama dengan nama class. Untuk melakukan hal ini Anda bisa mendeklarasikannya di properti $this->table. Berikut adalah contohnya:

Primary Key

Setiap class model membutuhkan properti primaryKey. Secara default Panada menggunakan nama id, namun Anda bisa menggunakan nama lain untuk konfigurasi ini. Berikut adalah contoh mendefenisikan nama primary key sesuai dengan nama yang ada di tabel:

Koneksi

Jika Anda memiliki koneksi database lebih dari satu dan ingin menggunakan koneksi tersebut pada class model ini, Anda bisa menggunakannya dengan memberikan nama koneksinya pada properti $this->connection. Berikut adalah contohnya:

Cara lain yang bisa digunakan tanpa perlu mendeklarasikannya di dalam class model adalah dengan meberikan argument string nama koneksi ketika membuat instance class model.

$users = new Models\Users( 'dbconnection2' );

Penggunaan

Tabel Contoh

Untuk mempermudah penjelasan setiap feature yang ada, berikut adalah tabel contoh yang digunakan dalam dokumentasi ini.

Sebelum proses manipulasi database dilakukan, Anda harus mendeklarasikan instance class yang namanya sesuai dengan nama tabel.

Save

Untuk menyimpan data baru ada dua cara yang bisa dilakukan. Cara pertama:

Atau dengan cara yang lebih cepat:

$users = new Models\Users( array('name' => 'Budi', 'email' => 'budi@budi.com', 'password' => 'mypassword') );

Kedua cara di atas merepresentasikan SQL:

INSERT INTO users (name, email, password) VALUES ('Budi', 'budi@budi.com', 'mypassword')

Jika argument pertama berupa array, maka jika diinginkan argument ke dua bisa diisikan nama koneksi database yang digunakan.

$users = new Models\Users( array('name' => 'Budi', 'email' => 'budi@budi.com', 'password' => 'mypassword'), 'dbconnection2' );

Find

Secara default method find() tanpa argument apapun akan menampilkan semua data yang ada di dalam tabel.

$users = new Models\Users;
print_r( $users->get() );

Untuk mendapatkan data dengan id 28, bisa dilakukan dengan cara:

$users = new Models\Users;
print_r( $users->get(28) );

Method ini merepresentasikan output SQL:

SELECT * FROM users WHERE id = 28

Atau jika ingin mendapatkan beberapa data sekaligus:

$users = new Models\Users;
print_r( $users->get(1,2,3) );

Method ini merepresentasikan output SQL:

SELECT * FROM users WHERE id IN (1, 2, 3)

Find First

Mendapatkan record pertama dari tabel:

$users = new Models\Users;
print_r( $users->first() );

Method ini merepresentasikan output SQL:

SELECT * FROM users ORDER BY id ASC LIMIT 1

Find Last

Mendapatkan record terakhir dari tabel:

$users = new Models\Users;
print_r( $users->last() );

Method ini merepresentasikan output SQL:

SELECT * FROM users ORDER BY id DESC LIMIT 1

Dynamic Finder

Cara lainnya adalah menggunakan Dynamic Finder. Cara ini ditujukan untuk mendapatkan record berdasarkan nama kolom tertentu.

Gunakan method getBy dan dikuti dengan nama_kolom yang akan dijadikan kriteria. Berikut adalah contohnya:

Jika data yang ditemukan hanya satu, maka nilai returnnya hanya sebuah object tunggal. Dan jika lebih dari satu, maka nilai returnya terdiri dari beberapa array object.

Condition

Untuk memfilter data berdasarkan kriteria tertentu, method condition() bisa digunakan.

object condition( string $column, string $operator, string $value, mix $seperator = false);

Parameter

Variable Tipe Data Keterangan
$column string Nama kolom yang menjadi kriteria penyeleksian.
$operator string Operator SQL: IN, BETWEEN, >, =<, !=
$value string | array Nilai yang akan dibandingkan dengan kolom.
$seperator mix Operator pemisah antara kondisi sebelum dan kondisi sesudah. Contoh: OR, AND

Berikut contoh penggunaan method ini:

Select

Untuk mendapatkan beberapa kolom dari tabel:

$users = new Models\Users;
$users->select('name');
print_r($users->get());

Limit Offset

object limit( int $limit , int $offset = null );

Berikut contoh penggunaanya:

$users = new Models\Users;
$users->limit(10);
print_r($users->get());

Order

object order( string $column , string $order = null );

Contoh penggunaan method order():

$users = new Models\Users;
$users->order('id', 'desc');
$users->limit(10);
print_r($users->get());

Group

object group( string $column1, $column2, $column3 ... );

Contoh penggunaan method group():

$users = new Models\Users;
$users->group('id', 'name');
$users->order('id', 'desc');
$users->limit(10);
print_r($users->get());

Update

Untuk memperbaharui data dengan id 28 caranya adalah:

Method ini merepresentasikan output SQL:

UPDATE users SET name = 'Jhon Budi', password = 'mynewpassword' WHERE id =28

Cara di atas adalah dengan me-load data terlebih dahulu, dalam hal ini id 28. Untuk melakukan update tanpa perlu meload data cara yang bisa dilakukan adalah:

Cara lainnya:

Update dengan kondisi:

Delete

Berikut adalah cara untuk menghapus data dengan id 28:

$users = new Models\Users;
$users->delete(28);

Method ini merepresentasikan output SQL:

DELETE FROM table_name WHERE id = 28

Cara alternatif:

Relational Active Record

Panada Active Record juga mendukung Object Relasional. Tipe relasional yang sudah didukung adalah BELONGS_TO, HAS_MANY, HAS_ONE dan MANY_MANY. Object Relasional digunakan untuk melakukan relasi tabel database antara satu model dengan model lainnya.

Untuk melakukan konfigurasi relasi, Anda harus membuat sebuah method bernama relations() di dalam class model dengan isi seperti berikut:

Dimana nilai array yang harus diisikan adalah:

return array( string 'nama_properti' => array( int self::TIPE_RELASI, string 'NamaModel', string 'foreignKey' ) );

Keterangan

Variable Tipe Data Keterangan
nama_properti string Adalah nama properties yang akan digunakan untuk memanggil model yang menjadi relasi.
self::TIPE_RELASI int Pilihan tipe relasi. Terdiri dari: self::BELONGS_TO, self::HAS_ONE, self::HAS_MANY dan self::MANY_MANY.
NamaModel string Nama class dari model yang akan direlasikan.
foreignKey string | array Nama kolom dari tabel yang merelasikan dengan sebuah model.

Belongs To

Relasi BELONGS_TO menunjukan relasi sebuah model yang memiliki satu nilai atau lebih terhadap sebuah model lain yang memiliki satu nilai. Contoh relasi ini adalah sejumlah artikel yang ada di dalam tabel posts yang dimiliki oleh satu orang penulis yang ada di tabel users.

Berikut adalah contoh dari model posts yang berelasi BELONGS_TO terhadap model users.

Model posts:

Model users:

Berikut adalah contoh penggunaan model posts di dalam controller:

Has Many

Pada contoh di atas, relasi dilihat dari sudut pandang model posts. Contoh yang sama bisa juga diterapkan pada relasi HAS_MANY, tetapi yang membedakan adalah sudut pandang relasi dilihat dari model users.

Seorang user atau penulis dapat dipastikan bisa memiliki post atau artikel lebih dari satu.

Berikut adalah contoh penggunaan relasi HAS_MANY di dalam controller:

Has One

Relasi HAS_ONE adalah relasi sebuah record yang hanya berrelasi dengan sebuah record dari model yang lain. Contohnya adalah, tabel user berelasi dengan tabel profile. Dalam contoh ini seorang user hanya memiliki satu record data di dalam tabel profile.

Pada contoh class model users di atas, selain relasi HAS_MANY terhadap model posts, kita juga melihat relasi lain yaitu HAS_ONE terhadap model profiles. Untuk itu, kita membutuhkan satu buah model lagi yang bernama profiles.

Model profiles:

Berikut adalah contoh penggunaan relasi HAS_ONE model users terhadap model profiles di dalam controller:

Many Many

Relasi MANY_MANY adalah kombinasi BELONGS_TO dan HAS_MANY. Sebagai contoh, post atau artikel bisa memiliki banyak kategori. Dan begitupula bila dilihat dari sudut pandang yang lain, kategori bisa memiliki lebih dari satu post atau artikel.

Untuk melakukan relasi ini, dibutuhkan sebuah tabel bantuan yang menghubungkan antara tabel posts dan categories. Tabel ini sebagai contoh kita beri nama post_category, yang kolomnya terdiri dari post_id dan category_id.

Untuk menjalankan relasi ini, dibutuhkan sebuah class model yang bernama Categories. Berikut contohnya:

Yang perlu diperhatikan adalah array dari nilai return method condition. Parameter forignKey diisikan dengan data array seperti contoh berikut:

return array(
     string 'nama_properti' => array(
          int self::MANY_MANY,
          string 'nama_model',
          array array( string 'tabel_penghubung', string 'forignKey1', string 'forignKey2' )
     )
);

Dan kalau kita lihat kembali konfigurasi method relations() Model Posts yang berelasi terhadap Cetegories, nilainya adalah kebalikan dari konfigurasi di atas.

'categories' => array(self::MANY_MANY, 'Categories', array('post_category', 'category_id', 'post_id') )

Berikut adalah contoh penggunaan relasi MANY_MANY di dalam controller:

Diskusi