Breaking

Sabtu, 24 Juni 2017

Memahami Relasi Tabel pada Yii2

Basis data yang saat ini kita pakai masih banyak yang mengusung konsep RDBMS atau Relational Database Management System. Sesuai namanya, sistem yang digunakan untuk mengelolanya adalah relational yang berarti bahwa antara satu tabel dengan tabel yang lainnya memiliki hubungan (relasi). Hubungan tersebut bermacam-macam bentuknya, bisa one-to-one, one-to-many, bahkan many-to-many. Kita akan mempelajari bagaimana merelasikan antar-tabel tetapi dalam konteks aplikasi PHP menggunakan Yii Framework. Terlepas, apakah secara struktur basis data tabel-tabel tersebut benar-benar berelasi atau tidak.

Dalam pembelajaran ini kita akan menggunakan kelas ActiveRecord miliki Yii. Oleh karena itu, setiap tabel yang dicontohkan di sini harus dibuat Model-nya terlebih dahulu. Silakan gunakan Gii untuk membuat model.

Relasi One-to-One

Relasi ini berarti bahwa setiap satu baris data pada tabel A memiliki satu relasi dengan satu baris pada tabel B. Sebagai contoh adalah tabel user (bawaan Yii Framework) dengan tabel profil. Tabel profil berisi informasi lebih lengkap mengenai user dari sistem kita. Kedua tabel tersebut memiliki sebuah field yang akan kita gunakan sebagai jangkar atau penghubung. Syaratnya, kedua field tersebut memiliki tipe data yang sama. Pada tabel user, field-nya adalah id sedangkan tabel profil field-nya adalah user_id.


Bagaimana membuat relasinya? Gunakan fungsi hasOne() seperti pada contoh berikut:

use app\models\Profil;

class User extends ActiveRecord implements IdentityInterface
{
//...
public function getProfil() //nanti diakses nama field 'profil'
{
return $this->hasOne(Profil::className(), ['user_id' => 'id']);
}
}


Rumusnya adalah:


public function getNamaTerserahAnda(){
return $this->hasOne(NamaModelKelasRelasi, ['field_kelas_relasi' => 'field_kelas_ini']);
}


Contoh gridview-nya seperti ini:

<?= GridView::widget([
'dataProvider' => $dataProvider,
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'username',
'profil.namalengkap',
],
]); ?>


Relasi One-To-Many

Untuk one-to-many ini mari kita gunakan sebuah contoh tabel post yang berisi tulisan-tulisan oleh para pengguna.


Masih di kelas User, kita tambahkan fungsi berikut:

public function getPosts()
{
return $this->hasMany(Post::className(), ['user_id' => 'id']);

}


Pada bagian controller, kita menggunakan kode berikut:


public function actionPost()
{
return $this->render('user_post', [
'model' => User::find()->all(),
]);
}

Pada bagian view, dapat digunakan sintaks seperti berikut:

foreach ($model as $user) {
echo '<b>Nama lengkap: ' . $user->profil['namalengkap'] . '</b><br>'; //kita dapatkan dari relasi one-to-one dengan profil
echo 'Postingan: <ul>';
foreach ($user->posts as $post) {
echo '<li>'. $post->judul.'</li>';
}
echo '</ul>';
}

Relasi Many-to-Many

Contoh mudah untuk kasus many-to-many adalah barang dan pesanan. Setiap pesanan dapat berisi banyak jenis barang, serta satu jenis barang bisa dimasukkan dalam berbagai pesanan.



Kode yang kita gunakan:

class Pesanan extends ActiveRecord
{
public function getBarangs()
{
return $this->hasMany(Barang::className(), ['id' => 'barang_id'])
->viaTable('barang_pesanan', ['pesanan_id' => 'id']);
}
}


atau alternatifnya juga bisa dibuat seperti ini:

class Pesanan extends ActiveRecord
{
public function getPesananBarangs()
{
return $this->hasMany(PesananBarang::className(), ['pesanan_id' => 'id']);

}

public function getBarangs()
{
return $this->hasMany(Barang::className(), ['id' => 'barang_id'])
->via('PesananBarangs');
}
}


Demikian, semoga bermanfaat dan selamat belajar!



Referensi:
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#relational-data



Tidak ada komentar:

Posting Komentar

close