Relasi One To One Eloquent
Dalam tutorial Relasi One To One Eloquent ini akan kita uraikan satu per satu fitur keren Eloquent Relationship laravel.
Diantaranya adalah :
- One To One
- One To Many
- Many To Many
Jika teman-teman pernah belajar perancangan database, pasti sudah tidak asing dengan list di atas. atau biasanya juga disebut dengan 1 .. 1, 1 .. n, n .. n.
Biasanya untuk menghubungkan 2 table atau lebih, kita menggunakan fungsi join, atau langsung menggabungkannya menggunakan query sql. Tapi di laravel, sudah ada ada fitur untuk menghubungkan 2 table atau lebih. yaitu sudah diterapkan dalam Eloquent. jadi kita bisa menampilkan data dari 2 table atau lebih dengan laravel.
Yuk langsung kita simak penjelasan berikut.
Relasi One To One Eloquent
Relasi One To One maksudnya 1 record data dari table A memiliki relasi ke 1 record data di table B.
Saya buatkan contohnya. gambar di atas adalah contoh sederhana one to one relationship. misalnya satu orang pengguna, memiliki satu nomor telepon. begitu juga kebalikannya, satu record data nomor telepon dimiliki oleh satu orang pengguna.
Langsung saja kita masuk ke contoh penggunaan Relasi One To One dengan Eloquent Laravel.
Contoh Relasi One To One Eloquent
Seperti pada gambar di atas, kita akan membuat dan menggunakan dua buah table seperti yang ada pada gambar di atas, yaitu kita akan menggunakan table pengguna dan table telepon sebagai contoh.
Silahkan teman-teman buat kedua buah table tersebut. teman-teman bisa membuatnya dengan menggunakan Migration dan mengisi datanya dengan Seeding Faker.
Atau jika teman-teman ingin mengimport langsung, 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
|
— phpMyAdmin SQL Dump
— version 4.8.3
— https://www.phpmyadmin.net/
—
— Host: localhost:3306
— Generation Time: Jan 14, 2019 at 08:00 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 `pengguna`
—
CREATE TABLE `pengguna` (
`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 `pengguna`
—
INSERT INTO `pengguna` (`id`, `nama`, `created_at`, `updated_at`) VALUES
(1, ‘Padmi Kamila Hassanah S.Farm’, NULL, NULL),
(2, ‘Julia Oktaviani’, NULL, NULL),
(3, ‘Darmana Sitompul’, NULL, NULL),
(4, ‘Naradi Nainggolan’, NULL, NULL),
(5, ‘Tedi Winarno’, NULL, NULL),
(6, ‘Ulya Yani Permata S.Pt’, NULL, NULL),
(7, ‘Maida Uyainah’, NULL, NULL),
(8, ‘Putri Dian Nasyidah M.Pd’, NULL, NULL),
(9, ‘Lantar Uwais’, NULL, NULL);
— ——————————————————–
—
— Table structure for table `telepon`
—
CREATE TABLE `telepon` (
`id` int(10) UNSIGNED NOT NULL,
`nomor_telepon` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`pengguna_id` int(11) 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 `telepon`
—
INSERT INTO `telepon` (`id`, `nomor_telepon`, `pengguna_id`, `created_at`, `updated_at`) VALUES
(1, ‘(+62) 878 0989 834’, 1, NULL, NULL),
(2, ‘(+62) 509 9868 0557’, 2, NULL, NULL),
(3, ‘023 9503 4379’, 3, NULL, NULL),
(4, ‘(+62) 24 1120 052’, 4, NULL, NULL),
(5, ‘0535 3676 2454’, 5, NULL, NULL),
(6, ‘0614 0945 4128’, 6, NULL, NULL),
(7, ‘0460 8541 5478’, 7, NULL, NULL),
(8, ‘(+62) 713 5497 976’, 8, NULL, NULL),
(9, ‘(+62) 653 4057 294’, 9, NULL, NULL);
—
— Indexes for dumped tables
—
—
— Indexes for table `pengguna`
—
ALTER TABLE `pengguna`
ADD PRIMARY KEY (`id`);
—
— Indexes for table `telepon`
—
ALTER TABLE `telepon`
ADD PRIMARY KEY (`id`);
—
— AUTO_INCREMENT for dumped tables
—
—
— AUTO_INCREMENT for table `pengguna`
—
ALTER TABLE `pengguna`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
—
— AUTO_INCREMENT for table `telepon`
—
ALTER TABLE `telepon`
MODIFY `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10;
|
Sampai di sini kita sudah punya table pengguna dan table telepon.
dan saya sudah mengisi data sebagai contoh saja.
Kemudian silahkan buat model model untuk pengguna.
php artisan make:model Pengguna
Kemudian buka model Pengguna yang sudah dibuat tersebut. dan ketik perintah berikut.
belajar_laravel/app/Pengguna.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Pengguna extends Model
{
protected $table = “pengguna”;
public function telepon()
{
return $this–>hasOne(‘App\Telepon’);
}
}
|
Di sini kita memberitahukan bahwa table yang digunakan adalah table “pengguna”. bukan “penggunas” (plural). bagian ini sudah dijelaskan pada tutorial sebelumnya tentang pembuatan model dan penamaan otomatisnya pada laravel.
Selanjutnya kita buat sebuah fungsi baru untuk memberitahukan model pengguna, bahwa table pengguna memiliki relasi 1 ke model atau table telepon.
1
2
3
|
public function telepon(){
return $this–>hasOne(‘App\Telepon’);
}
|
Sekarang buat model untuk table telepon.
php artisan make:model Telepon
belajar_laravel/app/Telepon.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 Telepon extends Model
{
protected $table = “telepon”;
public function pengguna()
{
return $this–>belongsTo(‘App\Pengguna’);
}
}
|
Pada model telepon ini, kita deklarasikan dulu bahwa table yang kita gunakan adalah table “telepon”.
1
|
protected $table = “telepon”;
|
kemudian kita buat fungsi untuk menjelaskan pada model telepon, bahwa model telepon terhubung dengan model pengguna.
1
2
3
4
|
public function pengguna()
{
return $this–>belongsTo(‘App\Pengguna’);
}
|
Nah, coba teman-teman perhatikan. sebelumnya pada model Pengguna, kita memberitahukan bahwa table pengguna memiliki relasi 1 ke table telepon.
dan di Model telepon kita beritahu bahwa table telepon ini dimiliki oleh table pengguna.
Jadi satu sama lain sudah terhubung sekarang.
Kedua table ini dihubungkan oleh kolum pengguna_id yang ada pada table telepon.
nama kolum pengguna_id mengikuti nama table yang dihubungkan dengannya. jadi secara otomatis table telepon mencari id pengguna nya masing-masing ke table pengguna.
pengguna = pengguna_id
Sungguh sangat sederhana. fitur ini akan banyak sekali teman-teman butuhkan pada saat teman-teman membuat aplikasi yang berukuran besar. kita tidak perlu lagi repot-repot menghubungkan table.
cukup mendeklarasikan pada model nya masing-masing, bahwa model tersebut terhubung ke table/model mana saja. dan bagaiamana jenisnya, one to one kah? one to many? atau many to many.
Pada tutorial ini kita masih membahas relasi one to one. pada tutorial selanjutnya kita juga akan membahas relasi one to many dan many to many.
Oke kita lihat hasilnya.
Buat route “/pengguna”, kita akan menampilkan data pengguna dan data nomor telepon masing-masing pengguna pada route ini.
belajar_laravel/routes/web.php
1
|
Route::get(‘/pengguna’, ‘PenggunaController@index’);
|
kemudian buat controller PenggunaController.php.
saya mencoba membuat controller ini menggunakan php artisan. masuk ke direktori project laravel kita, dan ketik perintah berikut.
php artisan make:controller PenggunaController
Cara membuat controller pada laravel menggunakan php artisan sudah saya jelaskan pada tutorial sebelumnya.
Baca : Tutorial Laravel #3 : Membuat Controller Dengan Laravel
Setelah membuat controller PenggunaController.php, kemudian buat method index() di dalamnya.
belajar_laravel/app/Http/controllers/PenggunaController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
// memanggil model Pengguna
use App\Pengguna;
class PenggunaController extends Controller
{
public function index()
{
// mengambil semua data pengguna
$pengguna = Pengguna::all();
// return data ke view
return view(‘pengguna’, [‘pengguna’ => $pengguna]);
}
}
|
pada controller ini kita ambil data pengguna, dan kita return ke view pengguna, caranya masih sama seperti yang sudah kita pelajari sebelumnya.
buat sebuah view untuk menampilkan data pengguna. buat view sesuai dengan yang sudah kita tentukan pada controller, yaitu view pengguna.blade.php
belajar_laravel/resources/views/pengguna.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
|
<!DOCTYPE html>
<html>
<head>
<title>Tutorial Laravel #23 : Relasi One To One 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 One Relationship</h5>
<table class=“table table-bordered table-striped”>
<thead>
<tr>
<th>Pengguna</th>
<th>Nomor Telepon</th>
</tr>
</thead>
<tbody>
@foreach($pengguna as $p)
<tr>
<td>{{ $p–>nama }}</td>
<td>{{ $p–>telepon–>nomor_telepon }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
</div>
</body>
</html>
|
Perhatikan pada view di atas, kita menampilkan data pengguna menggunakan foreach.
1
2
3
4
5
6
|
@foreach($pengguna as $p)
<tr>
<td>{{ $p–>nama }}</td>
<td>{{ $p–>telepon–>nomor_telepon }}</td>
</tr>
@endforeach
|
Tapi ada yang keren di sini, kita bisa langsung mengakses data telepon dari data pengguna ini.
1
|
<td>{{ $p–>telepon–>nomor_telepon }}</td>
|
Hal ini bisa dilakukan karena kita sudah mendeklarasikan relasi one to one antara kedua table ini. (model/table pengguna dan model/table telepon).
dari variabel $p kita bisa langsung mengakses ke data telepon ( $p->telepon ), dan lebih spesifik lagi dengan memilih nama kolum nya ( $p->telepon->nomor_telepon ).
Kita lihat hasilnya ya.
silahkan jalankan project.
php artisan serve
dan akses
localhost:8000/pengguna
Maka berikut hasil one to one relationship yang kita dapatkan.
Oke teman-teman, sekian tutorial Relasi One To One Eloquent, semoga dapat bermanfaat untuk teman-teman semua.