Making Dooitkoo – Bagian 4

Laravel menyediakan struktur MVC untuk application server yang kurang lebih seperti gambar berikut.

App structure

Data Model

Dalam aplikasi Dooitkoo, ada 6 entitas utama yaitu User, Subject, Transaction, Note, Plan, & Category. Strukturnya kurang lebih seperti diagram crowfoot di bawah.

Data model

Secara logika, seharusnya Transaction ada di bawah Category karena kategori berisi kumpulan transaksi. Masalahnya, kalo skemanya begitu berarti setiap kali saya nyari transaksi, saya harus lewat tabel Category dulu. Ga efisien. Jadi saya bikin Transaction satu level (sibling) dengan Category & dua-duanya punya referensi (FK) ke Subject.

Setelah desain tabel dan kolom-kolomnya berikutnya saya bikin tabel di database. Pake fasilitas migration yang disediain Laravel.

Migration

Migration memungkinkan saya melakukan update database (bikin tabel, tambah kolom, hapus kolom, dsb) menggunakan skrip php dengan mudah dan aman karena saya bisa rollback (membatalkan update) kalo ternyata ada masalah. Setiap migration di Laravel 3 berbentuk sebuah class yang punya 2 method yaitu up dan down. Method up digunakan untuk update database, sedangkan down untuk rollback.

Sebelum memanfaatkan fitur ini, saya harus bikin tabel di database dengan nama migrations. Caranya bisa langsung bikin pake mysql command / phpmydamin atau lebih gampang lagi pakai artisan,

$ php artisan migrate:install

Untuk bikin migration class, saya pake laravel generator.

$ php artisan generate:migration create_users_table id:integer name:string email:string

Hasil perintah di atas adalah:


increments('id');
            $table->string('name');
            $table->string('email_address');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::drop('users');
    }

}

Kemudian jalanin perintah untuk migrasi untuk update database.

$ php artisan migrate

Kalo saya ingin rollback, perintahnya:

$ php artisan migrate:rollback

Hasilnya adalah semua update terhadap database yang dihasilkan perintah migrate sebelumnya akan dibatalkan.

Migrate rollback

Eloquent Model Class

Laravel menyediakan ORM yang disebut Eloquent. Setelah database siap, saya perlu bikin Model, satu untuk setiap tabel. Untuk bikin Model saya bisa pake generator atau bob.

#pake laravel generator
$ php artisan generate:model transaction

#pake bob
$ php artisan build::model category has_many:transaction

Seting relationship pake Eloquent gampang sekali karena Laravel menyediakan beberapa function dengan nama yang mudah dihafal/dipahami:

  • has_many, untuk relasi one-to-many
  • has_one, untuk relasi one-to-one
  • belongs_to, untuk referensi ala foreign-key
  • has_many_and_belongs_to, untuk relasi many-to-many

Saya tinggal pake method di atas di dalam getter.

class Transaction extends Eloquent{

	public static $table = 'transactions';

	public function category{
		return $this->belongs_to('Category')
	}
}

class Categories extends Eloquent{

	public static $table = 'categories';

	//satu kategori punya banyak transaksi
	public function transactions(){
		return $this->has_many('Transaction')
	}
}

Kalo saya ingin mengambil semua transaksi dalam satu kategori, saya tulis

$transactions = Category::find(1)->transactions()->get();

//atau
$transactions = Category::find(1)->transactions;

Query Builder

Query builder menyediakan sarana untuk membuat query dengan mudah tanpa perlu menulis baris-baris SQL. Contoh:

DB::table('users')
	->where('id','=',1)
	->where('email','=','aa@bb.com')
	->first();

sama dengan SQL berikut

SELECT * FROM users WHERE id=1 AND email=aa@bb.com LIMIT 1

Raw Query

Gimana kalo saya ingin pake SQL query yang rumit? Saya bisa pake Query Builder atau raw-query menggunakan DB class.


DB::query('sql query yang panjang & rumit dengan join, subselect, grup, dsb')

Dalam aplikasi Dooitkoo, saya banyak menggunakan data agregat yang rumit jadi saya lebih banyak pake raw-query daripada metode Eloquent ORM atau Query Builder. Keuntungannya adalah, saya bisa ngetes query pake mysql command. Jadi ga perlu reload browser.

Atur relasi pake ORM atau Foreign-Key?

Yang paling baik sih pake dua-duanya, ORM untuk akses tanpa nulis SQL & FK karena ada referential integrity & constraint. Tapi karena aplikasi ini masih dalam tahap pengembangan & struktur datanya belum 100% stabil, FK & constraint-nya malah ngerepotin. Saya jadi ga bisa langsung hapus baris / tabel sewaktu-waktu. Tapi karena nantinya juga bakal pake FK, saya siapin migration skrip dengan tambahan properti $table->engine="InnoDB" & set semua kolom FK sebagai unsigned integer,contohnya di migration untuk kolom yang isinya FK di tabel subject saya tulis $table->integer('user_id')->unsigned().

InnoDB atau MyISAM ? Banyak faktor yang mempengaruhi pemilihan db engine, misalnya ACID compliance, locking, dll. Tapi yang paling dasar adalah berdasarkan query yang akan dipake. Kalo SELECT jauh lebih dominan & kita butuh full-text search, misalnya untuk blog, situs majalah dsb, pilih MyISAM . Tapi kalo INSERT, UPDATE, dan DELETE juga banyak & kita ga butuh full-text search, pilih InnoDB. Butuh FK, pilih InnoDB.

Controller

Nanti saya bahas di tulisan berikutnya ;-).

Also in this category ...


2 Comments

  1. fluent query buildernya lumayan fleksibel kok, kalo sesekali perlu raw query bisa diselipin DB::raw di query builder.
    unt testing query tinggal aktifin profiler di config database.

  2. @dheche iya, tapi lebih enak pake raw query kalo utk query yg rumit, bisa langsung dites di terminal. Ga usah reload aplikasi.

Comments are closed.