Relasi Many To Many adalah relasi antar table dimana banyak dari masing-masing record tersebut bisa memiliki banyak relasi ke table lainnya.
Penjelasan
Untuk tutorial relasi many to many, kita buat contoh dengan misalnya membuat sistem pendataan hadiah untuk pengguna. jadi misalnya kita bisa membuat pendataan untuk masing-masing anggota memiliki/mendapat hadiah apa saja. dan nanti kita bisa melihat untuk hadiah A, siapa saja pengguna yang mendapatkannya.
Untuk proses relasi many to many seperti ini ada 3 table yang kita butuhkan, katakanlah kita membutuhkan:
- table anggota
- table hadiah
- table anggota_hadiah
Table anggota kita gunakan untuk menyimpan data-data anggota, table hadiah untuk menyimpan data-data hadiah.
dan pasti teman-teman bertanya untuk apa kita membuat table anggota_hadiah ? untuk apa gunanya? dan kenapa harus diberi nama dengan anggota_hadiah? kenapa bukan hadiah_anggota atau yang lainnya?
Karena kita akan menghubungkan table anggota dan table hadiah. dan yang menjadi penghubungnya adalah table anggota_hadiah.
di sini table anggota_hadiah juga disebut sebagai pivot table. yaitu table yang menjadi penghubung beberapa table dalam proses relasi many to many.
untuk penamaannya kenapa kita namakan dengan table anggota_hadiah ? kenapa bukan hadiah_anggota?
karena laravel menerapkan sistem pengurutan alfabet. jadi laravel akan secara otomatis nama table tersebut adalah anggota_hadiah. karena huruf yang diurutkan adalah huruf pertama dari tiap kata. karena huruf A lebih dulu dari pada huruf H, maka jadinya anggota_hadiah.
Selanjutnya didalam table anggota_hadiah kita akan menyimpan id dari anggota dan id dari hadiah. dan kita beri nama masing-masing kolum nya dengan anggota_id dan hadiah_id.
Oke teman-teman saya rasa teman-teman sudah paham tentang penamaan table ini.
Persiapan
Pada tahap ini kita akan membuat table anggota, table hadiah, dan table anggota_hadiah.
table anggota
- id
- nama
table hadiah
- id
- nama_hadiah
table anggota_hadiah
- id
- anggota_id
- hadiah_id
Buat ketiga table tersebut lengkap dengan kolumnya seperti yang ada pada list di atas.
Teman-teman bisa membuat table ini seperti cara sebelumnya yang sudah kita pelajari, yaitu menggunakan model dan migration. kemudian diikuti dengan menginput data dummy menggunakan Faker.
Teman-teman bisa mengimport query sql berikut jika ingin cepat. di sini saya sudah membuat ketiga table diatas dan sudah saya isi dengan data dummy menggunakan Seeding Faker.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
— phpMyAdmin SQL Dump
— version 4.8.3
— https://www.phpmyadmin.net/
—
— Host: localhost:3306
— Generation Time: Jan 17, 2019 at 08:34 AM
— Server version: 5.7.23
— PHP Version: 7.2.10
SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
SET time_zone = “+00:00”;
—
— Database: `belajar_laravel`
—
— ——————————————————–
—
— Table structure for table `anggota`
—
CREATE TABLE `anggota` (
`id` int(10) UNSIGNED NOT NULL,
`nama` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
—
— Dumping data for table `anggota`
—
INSERT INTO `anggota` (`id`, `nama`, `created_at`, `updated_at`) VALUES
(1, ‘Sari Tania Puspita’, NULL, NULL),
(2, ‘Diki Alfarabi Hadi’, NULL, NULL),
(3, ‘Luluh Sinaga’, NULL, NULL),
(4, ‘Lamar Putra’, NULL, NULL),
(5, ‘Banawi Kuswoyo’, NULL, NULL),
(6, ‘Ratih Wijayanti’, NULL, NULL);
— ——————————————————–
—
— Table structure for table `anggota_hadiah`
—
CREATE TABLE `anggota_hadiah` (
`id` int(10) UNSIGNED NOT NULL,
`anggota_id` int(10) UNSIGNED NOT NULL,
`hadiah_id` int(10) UNSIGNED NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
—
— Dumping data for table `anggota_hadiah`
—
INSERT INTO `anggota_hadiah` (`id`, `anggota_id`, `hadiah_id`, `created_at`, `updated_at`) VALUES
(1, 6, 6, NULL, NULL),
(2, 2, 5, NULL, NULL),
(3, 6, 10, NULL, NULL),
(4, 3, 4, NULL, NULL),
(5, 3, 6, NULL, NULL),
(6, 1, 4, NULL, NULL),
(7, 4, 11, NULL, NULL),
(8, 5, 5, NULL, NULL),
(9, 2, 9, NULL, NULL),
(10, 6, 6, NULL, NULL),
(11, 3, 2, NULL, NULL),
(12, 2, 3, NULL, NULL),
(13, 1, 8, NULL, NULL),
(14, 6, 8, NULL, NULL),
(15, 3, 2, NULL, NULL);
— ——————————————————–
—
— Table structure for table `hadiah`
—
CREATE TABLE `hadiah` (
`id` int(10) UNSIGNED NOT NULL,
`nama_hadiah` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
—
— Dumping data for table `hadiah`
—
INSERT INTO `hadiah` (`id`, `nama_hadiah`, `created_at`, `updated_at`) VALUES
(1, ‘Kulkas’, NULL, NULL),
(2, ‘Lemari’, NULL, NULL),
(3, ‘Rumah’, NULL, NULL),
(4, ‘Mobil’, NULL, NULL),
(5, ‘Sepeda Motor’, NULL, NULL),
(6, ‘Pulpen’, NULL, NULL),
(7, ‘Tas’, NULL, NULL),
(8, ‘Sepatu’, NULL, NULL),
(9, ‘Voucher’, NULL, NULL),
(10, ‘Mouse’, NULL, NULL),
(11, ‘Laptop’, NULL, NULL);
—
— Indexes for dumped tables
—
—
— Indexes for table `anggota`
—
ALTER TABLE `anggota`
ADD PRIMARY KEY (`id`);
—
— Indexes for table `anggota_hadiah`
—
ALTER TABLE `anggota_hadiah`
ADD PRIMARY KEY (`id`);
—
— Indexes for table `hadiah`
—
ALTER TABLE `hadiah`
ADD PRIMARY KEY (`id`);
—
— AUTO_INCREMENT for dumped tables
—
—
— AUTO_INCREMENT for table `anggota`
—
ALTER TABLE `anggota`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=9;
—
— AUTO_INCREMENT for table `anggota_hadiah`
—
ALTER TABLE `anggota_hadiah`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=16;
—
— AUTO_INCREMENT for table `hadiah`
—
ALTER TABLE `hadiah`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=12;
|
jangan lupa mengatur koneksi database laravel pada file .env.
Sampai di sini kita telah mempunyai 3 buah table.
Perhatikan pada gambar di atas,
pada table anggota_hadiah kita hubungkan antara kedua buah table lainnya. pada table anggota_hadiah kita hanya menyimpan data id anggota dan id hadiah. misalnya data yang pertama ada ratih wijayanti (id 6) memilik hadiah pulpen (id 6) dan seterusnya. jadi ingat, hanya id nya saja yang kita simpan.
Model
Pastikan kita telah memiliki model untuk anggota dan hadiah. jika belum silahkan teman-teman buat dulu kedua model tersebut.
php artisan make:model Anggota
dan
php artisan make:model Hadiah
Pada model Anggota.php, hubungkan dengan model/table hadiah.
belajar_laravel/app/Anggota.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Anggota extends Model
{
protected $table = “anggota”;
public function hadiah()
{
return $this–>belongsToMany(‘App\Hadiah’);
}
}
|
Perhatikan pada model Anggota.php di atas, kita membuat method hadiah() untuk menghubungkan model anggota dangan model hadiah.
1
2
3
|
public function hadiah(){
return $this–>belongsToMany(‘App\Hadiah’);
}
|
Disini kita menggunakan fungsi belongsToMany() karena kita akan menbuat relasi many to many, pada model hadiah juga kita akan gunakan fungsi belongsToMany().
belajar_laravel/app/Hadiah.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Hadiah extends Model
{
protected $table = “hadiah”;
public function anggota()
{
return $this–>belongsToMany(‘App\Anggota’);
}
}
|
Oke tahap model selesai, kita lanjut dengan langsung membuat route.
Route
Langsung saja persiapkan route untuk menampilkan data anggota dan hadiahnya. disini saya membuat route baru yaitu:
belajar_laravel/routes/web.php
1
|
Route::get(‘/anggota’, ‘DikiController@index’);
|
Pada route ini kita akan menggunakan controller DikiController.php.
jadi buat sebuah controller baru, di sini saya membuat controllernya dengan menggunakan php artisan.
php artisan make:controller DikiController
Kemudian pada controller DikiController.php buat method index().
belajar_laravel/app/Http/controllers/DikiController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Anggota;
use App\Hadiah;
class DikiController extends Controller
{
public function index()
{
$anggota = Anggota::get();
return view(‘anggota’, [‘anggota’ => $anggota]);
}
}
|
Perhatikan pada controller di atas, kita panggil dulu model yang kita perlukan.
1
2
|
use App\Anggota;
use App\Hadiah;
|
kemudian method index() nya kita ambil data anggota dari database dan kita passing ke view anggota.blade.php
1
2
3
4
|
public function index(){
$anggota = Anggota::get();
return view(‘anggota’, [‘anggota’ => $anggota]);
}
|
Buat view nya.
belajar_laravel/resources/views/anggota.blade.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<!DOCTYPE html>
<html>
<head>
<title>Tutorial Laravel #25 : Relasi Many To Many Eloquent</title>
<link href=“https://stackpath.bootstrapcdn.com/bootstrap/4.2.1/css/bootstrap.min.css” rel=“stylesheet”>
</head>
<body>
<div class=“container”>
<div class=“card mt-5”>
<div class=“card-body”>
<h3 class=“text-center”><a href=“https://www.malasngoding.com”>www.malasngoding.com</a></h3>
<h5 class=“text-center my-4”>Eloquent Many To Many Relationship</h5>
<table class=“table table-bordered table-striped”>
<thead>
<tr>
<th>Nama Pengguna</th>
<th>Hadiah</th>
<th width=“1%”>Jumlah</th>
</tr>
</thead>
<tbody>
@foreach($anggota as $a)
<tr>
<td>{{ $a–>nama }}</td>
<td>
<ul>
@foreach($a–>hadiah as $h)
<li> {{ $h–>nama_hadiah }} </li>
@endforeach
</ul>
</td>
<td class=“text-center”>{{ $a–>hadiah–>count() }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
|
Nah, pada view langsung kita tampilkan datanya. seperti yang teman-teman lihat, karena model anggota sudah terhubung dengan model hadiah (many to many), sekarang kita bisa langsung mengakses data hadiah masih-masing anggota di dalam variabel $anggota yang kita passing dari controller.
$a->hadiah berisi data hadiah untuk masing-masing anggota. tergantung yang kita hubungkan pada table anggota_hadiah sebelumnya.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<tbody>
@foreach($anggota as $a)
<tr>
<td>{{ $a–>nama }}</td>
<td>
<ul>
@foreach($a–>hadiah as $h)
<li> {{ $h–>nama_hadiah }} </li>
@endforeach
</ul>
</td>
<td class=“text-center”>{{ $a–>hadiah–>count() }}</td>
</tr>
@endforeach
</tbody>
|
Kita lihat hasilnya ya.
Jalankan project.
php artisan serve
akses
localhost:8000/anggota
Bisa teman-teman lihat pada contoh di atas, misalnya diki alfarabi hadi memiliki hadiah apa saja, dan berapa jumlahnya sudah kelihatan. data yang tampil sesuai dengan data id anggota dan hadiah yang sudah kita set pada table anggota_hadiah.