CakePHP Indonesia : Berita, Artikel, Forum, Tutorial Framework CakePHP Berbahasa Indonesia untuk Pemula dan Tingkat Lanjut


posting terbaru


[tanya-jawab] HABTM ? Whaz that …

Ada seorang teman yang bertanya (menjawab mas imamiscool di Posting saya yang lalu)

mau tanya:

database ku: :dst

users: user_id, user_name
posts: post_id, post_content
user_post: user_id, post_id

MODEL
UserModel
PostModel

CONTROLLER
User
Post

VIEW
User
Post


gimana cara nampilin content2 (post_content) pada halaman User, sedangkan pada Model User table yang digunakan adalah `users`,
I mean: gimana nerapin INNER JOIN di cakePHP-MVC schema?
fungsi itu ditaro dimana? Post, User, ato (ngga mungkin) UserPost [?]

Humm … oke deh mas imam. Saya coba bantu ya. Kalau melihat pertanyaan beliau, relasi antara tabel user dan post ini adalah relasi many to many (n to n), yang artinya, mau tidak mau antara tabel user dan tabel post harus dibuat sebuah metode normalisasi (yap, dan sepertinya mas imam sudah melakukannya dengan membuat tabel user_post).

CakePHP mengenal istilah asosiasi HABTM (has and belong to many), sebuah asosiasi antar model yang disamakan dengan relasi n to n pada database relasional. Untuk membuat relasi ini berjalan dengan baik, relasi HABTM haruslah didefinisikan pada dua model yang bertautan (misalkan : model User dan model Post, sedangkan tabel untuk menggabungkannya adalah posts_users). Maka, kita definisikan saja pada model User :

var $hasAndBelongsToMany =
array(’Post’ =>
array(’className’ => ‘Post’,
‘joinTable’ => ‘posts_users’,
‘foreignKey’ => ‘user_id’,
‘associationForeignKey’=> ‘post_id’,
‘conditions’ => ”,
‘order’ => ”,
‘limit’ => ”,
‘uniq’ => true,
‘finderQuery’ => ”,
‘deleteQuery’ => ”
)
);

dan pada model Post :

var $hasAndBelongsToMany = array(’User’ =>
array(’className’ => ‘User’,
‘joinTable’ => ‘posts_users’,
‘foreignKey’ => ‘post_id’,
‘associationForeignKey’=> ‘user_id’,
‘conditions’ => ”,
‘order’ => ”,
‘limit’ => ”,
‘uniq’ => true,
‘finderQuery’ => ”,
‘deleteQuery’ => ”
)
);

So, kedua model sudah terjalin (dan kalau memang ini yang dimaksud dengan “inner join” – nya, maka CakePHP sudah melakukannya secara otomatis). Untuk menggunakannya, tinggal dikasi perintah aja di controller aja (misal di controller Users) :

$postingan = $this->User->Post->findAll();

yang hasilnya berbentuk array. Untuk melibatkan berbagai macam klausa / condition SQL, silahkan lihat di API nya CakePHP, tentang parameter-parameter (berupa condition, order, limitation, dll) pada fungsi findAll, findById, dan sebagainya.
Dan untuk mengecek hasil yang berupa array tadi, gunakan saja fungsi print_r

print_r($postingan);

Untuk lebih jelasnya, mas imam bisa melihat artikel ini :

1. HABTM association in bakery


2. HABTM tutorial in flipflops.org

Happy coding …. :)



CakePHP mengenal metode Bind dan Unbind. Dengan metode ini, seorang programmer akan dengan sangat mudah menghubungkan sebuah model dengan model yang lain, dalam waktu singkat, dengan model asosiasi yang disediakan oleh CakePHP (ada empat model asosiasi : hasOne, hasMany, belongsTo, hasAndBelongsToMany). Model dasar dari kedua fungsi ini adalah sebagai berikut :

$this->Model->bindModel(
array(’associationName’ => array(
‘associatedModelClassName’ => array(
// normal association keys go here…
)
)
)
);

Bind digunakan untuk membuat asosiasi baru, sebagaimana contoh di atas. Bind ini hanya akan berjalan untuk satu kali definisi saja, dan untuk menggunakannya kembali, programmer harus mendefinisikan ulang asosiasi yang akan dibuat antar dua model yang sebelumnya sama sekali tidak berhubungan.

Sedangkan unbind sebagai berikut :

$this->Leader->unbindModel(array(’hasMany’ => array(’Follower’)));

Unbind akan menghilangkan (untuk sementara) asosiasi yang sudah didefinisikan antar dua model. Sebagaimana bind, unbind hanya berlaku untuk satu kali pendefinisian saja.

Oke, kita masuk contoh kasus. Alkisah, ada tiga buah model dengan skema relasi antar tabel sebagai berikut :

1. Tabel Practicumnames, memiliki model Practicumname. Tabel ini berisi nama-nama praktikum yang ada di sebuah laboratorium. Tabel ini memiliki hubungan 1 to N (one to many) dengan tabel Practicumschedules. Artinya, satu mata praktikum bisa jadi memiliki jadwal lebih dari satu.

2. Tabel Practicumschedules, memiliki model Practicumschedule. Tabel ini berisi jadwal-jadwal praktikum untuk nama praktikum yang bersesuaian.  Tabel ini mempunyai relasi N to 1 (many to one) dengan tabel Practicumnames serta relasi N to N (many to many) dengan tabel Practicians.

3. Tabel Practicians, memiliki model Practician. Tabel ini berisi nama-nama praktikan yang terdaftar dan memiliki relasi N to N (many to many) dengan tabel Practicumschedules.

skema-bind-unbind

Pertanyaannya : Bagaimana caranya, jika kita ingin mengambil beberapa record yang ada hubungannya, antara practician dengan practicumnames ? Misalkan, kita ingin tahu praktikum apa saja yang diikuti oleh seorang praktikan yang terdaftar.

Jawaban : gunakan Bind. Lihat contoh di bawah ini,

$this->Practician->bindModel(
array(’hasAndBelongsToMany’ => array(
‘Practicumname’ => array(
‘className’ => ‘Practicumname’,
)
)
)
);

Clear ! Oke, kita bisa langsung membuat sebuah asosiasi antar model Practician dengan Practicumname dan langsung saja kita mengeksekusi fungsi-fungsi



Beberapa waktu yang lalu, saya membuka Mail Manager saya dan melihat banyak komplain dari temen-temen user forum (yang sudah mendaftar di forum diskusi IdCake) tidak menerima email aktivasi dari situs ini. Hmm, saya pikir waktu itu pasti ada yang keliru dengan berbagai macam script konfigurasi yang ada di forumnya. Atau barangkali ada setting yang salah

Jawaban itu berhasil saya temukan. Ternyata memang hosting situs IdCake mematikan fungsi PHP Sendmail dan SMTP, sehingga semua aksi yang ada hubungannya dengan “mengirim email dari situs ini” tidak bisa terpenuhi. Saat ini, saya sedang mengusahakan agar fungsi sendmail bisa aktif, dan melalui artikel ini saya mohon maaf kepada teman-tema yang kemarin sudah ndaftar (hehehe, maap banget mas. Mungkin perlu ndaftar lagi nih, kalo dah aktif sendmail nya. Sori banget ….).

Insya Allah dalam waktu dekat, jika sudah ada kepastian akan saya buka kembali forumnya. Buat temen-temen yang kepingin dapet user di blog-nya, kirim aja email ke sunu.wibirama@yahoo.co.id (untuk sementara ya mas).Passwordnya nanti saya kirim balik, insya Allah.

Sekali lagi mohon maaf ….





CakePHP Indonesia is powered by WordPress 2.0 | Using furCake v.2.0 theme developed by Sunu Wibirama