Seperti yang sudah kita pelajari sebelumnya, Eloquent memiliki fitur untuk membuat relasi antar table dengan mudah. relasi one to many adalah relasi antar table yang mana satu buah table bisa memiliki banyak relasi ke record data yang ada di table yang satunya.
Akan saya contohkan dengan table articles, dan table tags. sebuah article bisa memiliki banyak tags, dan banyak tags bisa dimiliki oleh satu article. jadinya one to many atau many to one. 1 .. n atau n .. 1.
Persiapan
Kita akan membuat dua buah table, yaitu table article, dan table tags. dimana nantinya akan kita buat relasi table one to many (satu article bisa memiliki banyak tags).
Silahkan teman-teman buat kedua buah table tersebut dengan fitur migration dan mengisi data dummy ke dalam kedua table tersebut dengan menggunakan Faker.
Baca : Seeding dan Faker Pada Laravel
atau jika teman-teman ingin cepat, silahkan import sql berikut.
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
|
— phpMyAdmin SQL Dump
— version 4.8.3
— https://www.phpmyadmin.net/
—
— Host: localhost:3306
— Generation Time: Jan 15, 2019 at 05:52 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 `articles`
—
CREATE TABLE `articles` (
`id` int(10) UNSIGNED NOT NULL,
`judul` 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 `articles`
—
INSERT INTO `articles` (`id`, `judul`, `created_at`, `updated_at`) VALUES
(1, ‘Placeat saepe ea possimus provident quos est molestiae reiciendis.’, NULL, NULL),
(2, ‘Totam laudantium molestiae similique sit.’, NULL, NULL),
(3, ‘Aut consequatur ducimus ut non voluptatem voluptas.’, NULL, NULL),
(4, ‘Ad sit voluptatem qui ut dolorem.’, NULL, NULL),
(5, ‘Qui consequatur eum fuga corrupti.’, NULL, NULL),
(6, ‘Quos nesciunt blanditiis amet odio.’, NULL, NULL),
(7, ‘Ex doloremque consequuntur velit alias repellendus ullam.’, NULL, NULL),
(8, ‘Perspiciatis a quo beatae nobis et suscipit illo.’, NULL, NULL),
(9, ‘Maiores voluptate animi est enim totam.’, NULL, NULL),
(10, ‘Rerum expedita inventore nulla voluptates perferendis placeat.’, NULL, NULL);
— ——————————————————–
—
— Table structure for table `tags`
—
CREATE TABLE `tags` (
`id` int(10) UNSIGNED NOT NULL,
`tag` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`article_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 `tags`
—
INSERT INTO `tags` (`id`, `tag`, `article_id`, `created_at`, `updated_at`) VALUES
(1, ‘dolores’, 2, NULL, NULL),
(2, ‘culpa’, 3, NULL, NULL),
(3, ‘sit’, 4, NULL, NULL),
(4, ‘quasi’, 3, NULL, NULL),
(5, ‘inventore’, 5, NULL, NULL),
(6, ‘ut’, 7, NULL, NULL),
(7, ‘quisquam’, 5, NULL, NULL),
(8, ‘fugiat’, 7, NULL, NULL),
(9, ‘perspiciatis’, 5, NULL, NULL),
(10, ‘voluptatem’, 3, NULL, NULL),
(11, ‘non’, 2, NULL, NULL),
(12, ‘ducimus’, 5, NULL, NULL),
(13, ‘tempora’, 4, NULL, NULL),
(14, ‘voluptatem’, 10, NULL, NULL),
(15, ‘nisi’, 3, NULL, NULL),
(16, ‘exercitationem’, 10, NULL, NULL),
(17, ‘sed’, 2, NULL, NULL),
(18, ‘tempora’, 6, NULL, NULL),
(19, ‘laudantium’, 7, NULL, NULL),
(20, ‘a’, 6, NULL, NULL),
(21, ‘consequuntur’, 9, NULL, NULL),
(22, ‘omnis’, 1, NULL, NULL),
(23, ‘rerum’, 9, NULL, NULL),
(24, ‘ut’, 1, NULL, NULL),
(25, ‘amet’, 10, NULL, NULL),
(26, ‘atque’, 9, NULL, NULL),
(27, ‘at’, 4, NULL, NULL),
(28, ‘hic’, 3, NULL, NULL),
(29, ‘itaque’, 1, NULL, NULL),
(30, ‘quia’, 9, NULL, NULL),
(31, ‘consequatur’, 8, NULL, NULL),
(32, ‘non’, 9, NULL, NULL),
(33, ‘explicabo’, 10, NULL, NULL),
(34, ‘eos’, 6, NULL, NULL),
(35, ‘eveniet’, 5, NULL, NULL),
(36, ‘dolor’, 10, NULL, NULL),
(37, ‘magnam’, 10, NULL, NULL),
(38, ‘aut’, 1, NULL, NULL),
(39, ‘et’, 6, NULL, NULL),
(40, ‘ut’, 10, NULL, NULL);
—
— Indexes for dumped tables
—
—
— Indexes for table `articles`
—
ALTER TABLE `articles`
ADD PRIMARY KEY (`id`);
—
— Indexes for table `tags`
—
ALTER TABLE `tags`
ADD PRIMARY KEY (`id`);
—
— AUTO_INCREMENT for dumped tables
—
—
— AUTO_INCREMENT for table `articles`
—
ALTER TABLE `articles`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11;
—
— AUTO_INCREMENT for table `tags`
—
ALTER TABLE `tags`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=41;
|
jangan lupa untuk mengatur pengaturan koneksi database, di sini database yang saya gunakan adalah “belajar_laravel“.
.env
1
2
3
4
5
6
|
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=belajar_laravel
DB_USERNAME=root
DB_PASSWORD=root
|
Persiapan kita anggap selesai.
Relasi One To Many Eloquent
Perhatikan sedikit konsep relasi antar table laravel one to many berikut.
Perhatikan. di sini kita memiliki beberapa data pada table articles. dan kita juga telah memiliki beberapa data pada table tags. kedua table ini akan dihubungkan secara otomatis oleh kolum article_id yang ada pada table tags.
maksudnya, article_id di ambil dari nama table (article) dan kolum (id) pada table tersebut. hal ini sudah secara otomatis dijalankan oleh eloquent. jadi silahkan teman-teman sesuaikan.
Seperti pada saat membuat contoh relasi one to one, kita membutuhkan model untuk kedua buah table tersebut. yaitu model article dan model tag.
Buat model article. disini saya membuat model dengan php artisan.
php artisan make:model Article
Karena sebelumnya kita membuat table dengan nama articles, jadi sudah sesuai plural penamaan pada nama model dan table nya. kita tidak perlu lagi mendeklarasikan protected $table = “articles”. tapi jika teman-teman ingin mendeklarasikan nya tidak masalah juga.
belajar_laravel/app/Article.php
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
public function tags(){
return $this–>hasMany(‘App\Tag’);
}
}
|
perhatikan pada model Article.php di atas. kita membuat fungsi untuk memberitahukan ke sistem bahwa kita akan membuat relasi Many ke model atau table tags.
1
2
3
|
public function tags(){
return $this–>hasMany(‘App\Tag’);
}
|
kita mendeklarasikan table/model article ini dengan model/table tag. menggunakan fungsi return $this->hasMany(‘App\Tag’). yang berarti kita memberitahukan bahwa article bisa mempunyai banyak tag.
Selanjutnya kita akan membuat kebalikannya.
Buat model Tag.php.
php artisan make:model Tag
Kemudian tulis fungsi berikut.
belajar_laravel/app/Tag.php
1
2
3
4
5
6
7
8
9
10
11
12
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class tag extends Model
{
public function article(){
return $this–>belongsTo(‘App\Article’);
}
}
|
Pada model Tag.php ini, kita deklarasikan bahwa table Tags ini dimiliki atau terhubung dengan model/table article.
1
2
3
|
public function article(){
return $this–>belongsTo(‘App\Article’);
}
|
Selanjutnya, kita akan mencoba menampilkan hasil dari contoh relasi one to many eloquent laravel ini.
Buat sebuah route baru.
belajar_laravel/routes/web.php
1
|
Route::get(‘/article’, ‘WebController@index’);
|
route yang kita buat ini akan menjalankan method index() pada controller WebController.
Buat controller WebController.php.
php artisan make:controller WebController
Selanjutnya buat method index() di dalamnya.
belajar_laravel/app/Http/controllers/WebController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Article;
class WebController extends Controller
{
public function index(){
$artikel = Article::all();
return view(‘article’,[‘artikel’ => $artikel]);
}
}
|
Perhatikan pada method index() di atas, kita mencoba mengambil semua data dari table articles melalui model article. dan kita passing data nya ke view article.blade.php.
1
2
3
4
|
public function index(){
$artikel = Article::all();
return view(‘article’,[‘artikel’ => $artikel]);
}
|
Pada view article.blade.php akan kita tampilkan semua article, lengkap dengan tag nya masing-masing yang sudah kita hubungkan relasi nya pada model Article.php dan model Tag.php.
Buat view article.blade.php.
belajar_laravel/resources/views/article.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
|
<!DOCTYPE html>
<html>
<head>
<title>Tutorial Laravel #24 : Relasi One 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 One To Many Relationship</h5>
<table class=“table table-bordered table-striped”>
<thead>
<tr>
<th>Judul Article</th>
<th>Tag</th>
<th width=“15%” class=“text-center”>Jumlah Tag</th>
</tr>
</thead>
<tbody>
@foreach($artikel as $a)
<tr>
<td>{{ $a–>judul }}</td>
<td>
@foreach($a–>tags as $t)
{{$t–>tag}},
@endforeach
</td>
<td class=“text-center”>{{ $a–>tags–>count() }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
|
dan coba kita lihat hasilnya sekarang.
php artisan serve
dan akses route article
localhost:8000/article
Seperti yang teman-teman perhatikan di atas, kita bisa langsung mengakses data tag untuk masing-masing judul, kita bisa langsung mengaksesnya dari data article.
1
2
3
4
5
6
|
<td>
@foreach($a–>tags as $t)
{{$t–>tag}},
@endforeach
</td>
<td class=“text-center”>{{ $a–>tags–>count() }}</td>
|
Untuk menghitung jumlah tag masing-masing article, kita bisa langsung menggunakan fungsi count() seperti yang ada pada contoh di atas.