Kali ini saya akan berbagi tips untuk menampilkan hasil dari relasi many-to-many antara tiga tabel. Contoh relasi many-to-many yaitu antara Book dan Author. Buku bisa ditulis oleh lebih dari satu Pengarang, dan Pengarang bisa menulis lebih dari satu Buku. Sehingga kita akan membuat tiga tabel : book, author, dan tabel Relasinya : book_author.
1. Buat tabel book, author, dan book_author dan isi dengan data dummy masing-masing :
Data dummy untuk book_author : Buku Satu ditulis oleh Pengarang Satu dan Pengarang Dua, Buku Dua ditulis oleh Pengarang Satu dan Pengarang Empat, Buku Tiga ditulis oleh Pengarang Satu, Pengarang Dua, dan Pengarang Tiga.
2. Buat Model Book, Author, dan BookAuthor di folder common.
3. Kita akan coba tampilkan di frontend. Buat public actionRelationview di SiteController.php /frontend/controllers.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
protected function findModel($id) { if (($model = \common\models\Book::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } } public function actionRelationview($id) { $model = $this->findModel($id); return $this->render('relationview', [ 'model' => $this->findModel($id), ]); } |
Buat file relationview.php di frontend/views/site/
4. Kita akan menampilkan Buku apa saja yang ditulis oleh Pengarang Satu.
Pertama-tama, hubungkan model Book dengan model BookAuthor dengan cara modifikasi model Book ( dengan menambahkan relasi hasMany yang berarti buku ditulis oleh banyak penulis :
1 2 3 4 |
public function getBookHasManyAuthor() { return $this->hasMany(BookAuthor::className(),['bookID'=>'id']); } |
Setelah itu, kita akan menghubungkan Model BookAuthor dengan model Author supaya bisa menampilkan nama Pengarangnya, dengan relasi HasOne. Tambahkan di Model BookAuthor.php :
1 2 3 4 |
public function getBookAuthorBelongsToAuthor() { return $this->hasOne(Author::className(), ['id' => 'authorID']); } |
5. Kita tuliskan kode berikut di relationview.php yang tadi sudah kita buat :
1 2 3 4 5 6 7 8 |
<?php if($model->bookHasManyAuthor):?> <h2><?= $model->bookName; ?> ditulis oleh : </h2> <p> <?php foreach($model->bookHasManyAuthor as $book):?> <?= $book->bookAuthorBelongsToAuthor->authorName."<br />";?> <?php endforeach;?> </p> <?php endif;?> |
Penjelasan : Jika model Buku kita dengan id tertentu memiliki author, maka tampilkan setiap author yang menulis buku tersebut.
Untuk mengaksesnya kita perlu menyertakan parameter id :
1 |
http://localhost/advanced/frontend/web/index.php?r=site/relationview&id=3 |
Coba sobat ganti-ganti id nya, maka akan menyesuaikan :
Happy Coding!