Tutorial Laravel #16 : Relasi Database dengan Eloquent

Dalam memanfaatkan database, dikenal ada relasi antar entity atau antar tabel. Penggunaan fitur ini pada database konvesional membutuhkan penggunaan perintah SQL yang relatif panjang dan juga membutuhkan penanganan dari program yang membutuhkan program yang rumit pula. Pada Laravel, relasi database dengan Eloquent akan memudahkan penggunaan database tersebut.

 

Relasi Database pada Laravel

Berikut adalah beberapa jenis relasi database yang dikenal pada umumnya dan telah diakomodasi oleh Laravel.

  1. Relasi one to one dimana sebuah data pada sebuah tabel hanya memiliki relasi ke sebuah data pada tabel yang lain. Misalnya, sebuah data dalam tabel tbl_siswa memiliki relasi ke satu data di tabel tbl_kontak.
  2. Relasi one to many dimana sebuah data pada sebuah tabel memiliki relasi ke beberapa data pada tabel yang lain. Misalnya, sebuah data tabel tbl_kategori memiliki relasi banyak data buku di tbl_buku. Atau dengan kata lain 1 kategori memiliki banyak data buku.
  3. Relasi many to one (One to many Inverse) dimana merupakan kebalikan dari relasi one to many. Misalnya kita ingin mengetahui data buku di tbl_buku memiliki kategori apa, maka relasi ini yang akan digunakan.
  4. Relasi many to many dimana banyak data pada sebuah tabel memiliki relasi ke banyak data juga pada tabel yang lainnya, relasi tersebut terbentuk melalui sebuah tabel bantu. Misalnya banyak data pada tabel tbl_siswa memiliki relasi peminjaman ke banyak data pada tabel tbl_buku. Relasi tersebut terbentuk dengan tabel bantu bernama tbl_pinjam.

Untuk memulai tutorial ini kita buat dulu project laravelnya, pada tutorial ini menggunakan project dengan nama ‘latihan_laravel‘, cara membuat project laravel bisa dibaca di sini. Setelah project dibuat, pastikan kita sudah memiliki database, database yang digunakan pada contoh ini bernama ‘datasekolah‘. Jika sudah ada databasenya kita konfigurasi koneksi databasenya dengan project laravel kita pada file .env .

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=datasekolah
DB_USERNAME=root
DB_PASSWORD=

Nama project dan database silahkan bisa menyesuaikan dengan nama yang diinginkan oleh masing-masing.

 

Relasi One To One dengan Eloquent

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, dengan menggunakan Eloquent.

Relasi One To One maksudnya 1 record data dari table A memiliki relasi ke 1 record data di table B, misalnya satu orang siswa memiliki 1 nomor hp, begitu juga kebalikannya.

Sebagai contoh kita sekarang kita akan membuat dan menggunakan dua buah table, yaitu table siswa dan kontak. Sekarang kita buat kedua table tersebut, kita membuatnya dengan menggunakan Migration dan mengisi datanya dengan Seeding Faker.

Atau jika ingin mengimport langsung melalui phpmyadmin, silahkan download dan import sql berikut :

siswa.sql

-- phpMyAdmin SQL Dump
-- version 5.1.1
-- https://www.phpmyadmin.net/
--
-- Host: 127.0.0.1
-- Generation Time: Mar 02, 2022 at 08:36 AM
-- Server version: 10.4.22-MariaDB
-- PHP Version: 8.1.2

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
START TRANSACTION;
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;

--
-- Database: `datasekolah`
--

-- --------------------------------------------------------

--
-- Table structure for table `kontak`
--

CREATE TABLE `kontak` (
  `idkontak` int(10) UNSIGNED NOT NULL,
  `hp` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
  `idsiswa` int(10) 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 `kontak`
--

INSERT INTO `kontak` (`idkontak`, `hp`, `idsiswa`, `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);

-- --------------------------------------------------------

--
-- Table structure for table `siswa`
--

CREATE TABLE `siswa` (
  `idsiswa` int(10) UNSIGNED NOT NULL,
  `nis` int(11) NOT NULL,
  `nama` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `kelas` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `alamat` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `hp` 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 `siswa`
--

INSERT INTO `siswa` (`idsiswa`, `nis`, `nama`, `kelas`, `alamat`, `hp`, `created_at`, `updated_at`) VALUES
(1, 2021000, 'Maman Durahman', 'X RPL C', 'Jl. Cibeber Cimahi', 813889900, NULL, NULL),
(2, 2021001, 'Ahmad', 'X RPL A', 'Jl. Maharmartanegara', 813952233, NULL, NULL),
(3, 7, 'Dimas Pangestu M.TI.', 'Perum Widiastuti Simbolon', 'Ds. Agus Salim No. 799, Pasuruan 74413, Babel', 8184, NULL, NULL),
(4, 3, 'Gamblang Harjasa Sihombing', 'UD Wasita', 'Gg. Basket No. 232, Palembang 99364, Jateng', 8801, NULL, NULL),
(5, 1, 'Unjani Ira Rahmawati', 'CV Wulandari Damanik Tbk', 'Gg. Ters. Kiaracondong No. 844, Jayapura 32622, Banten', 8617, NULL, NULL),
(6, 0, 'Opung Taswir Iswahyudi M.Ak', 'PD Novitasari', 'Jln. Dewi Sartika No. 944, Pekalongan 53452, Sumbar', 8591, NULL, NULL),
(7, 1, 'Adika Uwais', 'PD Uyainah Tbk', 'Gg. Kyai Mojo No. 323, Serang 99860, Malut', 8851, NULL, NULL),
(8, 0, 'Tania Maryati', 'PT Purwanti Tbk', 'Jln. Rajawali No. 603, Gunungsitoli 33402, Kaltara', 8460, NULL, NULL),
(9, 1, 'Kenes Jayadi Prayoga S.Pd', 'PD Laksmiwati Tarihoran', 'Gg. Salam No. 374, Bekasi 11993, Riau', 8695, NULL, NULL),
(10, 3, 'Galak Ajiono Salahudin S.E.I', 'Perum Palastri Purnawati Tbk', 'Ds. Kiaracondong No. 48, Pariaman 69025, DKI', 8629, NULL, NULL),
(11, 9, 'Cawuk Tampubolon M.Kom.', 'CV Yolanda', 'Gg. Rajiman No. 475, Palopo 54944, Jabar', 8135, NULL, NULL),
(12, 3, 'Irma Yuniar S.Pt', 'PT Susanti (Persero) Tbk', 'Jr. Cikutra Timur No. 791, Ternate 68392, NTB', 8672, NULL, NULL),
(13, 7, 'Galuh Siregar', 'Perum Safitri (Persero) Tbk', 'Gg. Gegerkalong Hilir No. 701, Kotamobagu 63667, Sumbar', 8564, NULL, NULL),
(14, 3, 'Wani Padmi Yuniar S.Farm', 'CV Pudjiastuti Mayasari Tbk', 'Psr. Basudewo No. 245, Pekanbaru 33955, Sumbar', 8974, NULL, NULL),
(15, 3, 'Rangga Mahfud Suryono', 'Perum Permadi Habibi (Persero) Tbk', 'Ds. Rajiman No. 759, Banjar 30568, Sumsel', 8613, NULL, NULL),
(16, 4, 'Cindy Kusmawati', 'PT Wijaya', 'Psr. Wahid No. 890, Pontianak 18248, Riau', 8433, NULL, NULL),
(17, 2, 'Vanesa Lidya Novitasari', 'UD Hutasoit Tbk', 'Ds. HOS. Cjokroaminoto (Pasirkaliki) No. 791, Surabaya 43757, Babel', 8666, NULL, NULL),
(18, 2, 'Tedi Nababan', 'Perum Maheswara (Persero) Tbk', 'Gg. Baladewa No. 566, Tidore Kepulauan 69610, Sulut', 8302, NULL, NULL),
(19, 7, 'Rika Rachel Hartati', 'PD Lailasari Gunarto (Persero) Tbk', 'Ds. Peta No. 80, Balikpapan 67280, Bengkulu', 8167, NULL, NULL),
(20, 5, 'Puji Hartati S.Kom', 'CV Irawan', 'Ds. Pattimura No. 198, Kendari 55670, NTB', 8103, NULL, NULL),
(21, 0, 'Darmaji Simbolon', 'CV Wahyuni Prabowo Tbk', 'Jln. Ters. Pasir Koja No. 407, Tegal 10667, Sulbar', 8452, NULL, NULL),
(22, 4, 'Elma Astuti', 'CV Permata', 'Dk. Rajiman No. 424, Binjai 31565, Banten', 8459, NULL, NULL),
(23, 1, 'Emin Kamal Widodo', 'PD Halimah Tbk', 'Jr. Banda No. 624, Banjar 81200, Bengkulu', 8770, NULL, NULL),
(24, 4, 'Bakiono Caturangga Pangestu S.E.I', 'CV Uyainah Tbk', 'Dk. Bakaru No. 771, Dumai 19894, Riau', 8968, NULL, NULL),
(25, 4, 'Natalia Hassanah S.T.', 'CV Purwanti', 'Ds. Bakau No. 962, Batam 15057, Gorontalo', 8539, NULL, NULL),
(26, 9, 'Marsito Latupono', 'PD Usada', 'Dk. Suryo No. 724, Balikpapan 70089, Lampung', 8376, NULL, NULL),
(27, 9, 'Harjo Pranowo S.Pt', 'PD Purwanti Prastuti Tbk', 'Jr. Surapati No. 871, Medan 17638, Maluku', 8167, NULL, NULL),
(28, 3, 'Mala Paramita Prastuti', 'CV Usada', 'Kpg. Rajiman No. 951, Cilegon 92747, Lampung', 8726, NULL, NULL),
(29, 5, 'Bahuwirya Maulana', 'Perum Tarihoran Tbk', 'Kpg. Monginsidi No. 519, Lubuklinggau 70826, NTB', 8115, NULL, NULL),
(30, 3, 'Ana Handayani S.Kom', 'PT Wulandari Suwarno (Persero) Tbk', 'Dk. Siliwangi No. 731, Pontianak 17503, Sulteng', 8486, NULL, NULL),
(31, 3, 'Rahmi Purwanti', 'CV Nasyidah Waluyo', 'Ki. Barasak No. 146, Mojokerto 66589, Bali', 8089, NULL, NULL),
(32, 9, 'Sadina Kezia Mayasari', 'UD Sihotang', 'Jr. HOS. Cjokroaminoto (Pasirkaliki) No. 605, Ternate 96950, Aceh', 8667, NULL, NULL),
(33, 2, 'Danang Anggriawan S.Kom', 'PT Farida Maulana Tbk', 'Ds. Baranang Siang No. 324, Yogyakarta 15024, Sulteng', 8184, NULL, NULL),
(34, 6, 'Hilda Susanti', 'PT Purnawati', 'Jr. Bara Tambar No. 755, Pariaman 94596, Sulbar', 8992, NULL, NULL),
(35, 1, 'Bahuwarna Simon Jailani S.Sos', 'CV Kuswoyo Saptono', 'Ki. Baranangsiang No. 28, Cirebon 94935, Sumsel', 8276, NULL, NULL),
(36, 7, 'Xanana Irnanto Dongoran', 'Perum Lailasari Novitasari (Persero) Tbk', 'Jr. Bak Air No. 701, Lubuklinggau 24522, Sulsel', 8204, NULL, NULL),
(37, 5, 'Halima Rahayu', 'PD Suryatmi Agustina Tbk', 'Ki. Honggowongso No. 792, Pasuruan 63635, Sumsel', 8369, NULL, NULL),
(38, 9, 'Balapati Simbolon M.Farm', 'PT Hasanah (Persero) Tbk', 'Kpg. Baya Kali Bungur No. 908, Pagar Alam 39240, Bengkulu', 8893, NULL, NULL),
(39, 0, 'Rahayu Nasyiah M.Pd', 'PT Pratama (Persero) Tbk', 'Jln. Katamso No. 470, Sabang 89266, Kalteng', 8811, NULL, NULL),
(40, 8, 'Jinawi Wasita S.H.', 'UD Palastri Sinaga', 'Kpg. Jayawijaya No. 62, Palangka Raya 19364, Papua', 8018, NULL, NULL),
(41, 3, 'Hesti Wastuti', 'Perum Permata Farida', 'Gg. Bagis Utama No. 91, Dumai 84590, Sulut', 8836, NULL, NULL),
(42, 1, 'Jati Cahyo Wahyudin S.Gz', 'PT Pudjiastuti Novitasari (Persero) Tbk', 'Ds. Wahidin Sudirohusodo No. 553, Blitar 85474, Sulsel', 8792, NULL, NULL),
(43, 3, 'Cahyanto Tamba S.IP', 'PD Anggraini Salahudin Tbk', 'Kpg. Wahidin Sudirohusodo No. 232, Kediri 61847, Sultra', 8701, NULL, NULL),
(44, 7, 'Rachel Pudjiastuti', 'Perum Hakim Farida Tbk', 'Jr. Casablanca No. 252, Pematangsiantar 15145, Lampung', 8610, NULL, NULL),
(45, 8, 'Kenari Waskita S.E.I', 'Perum Hakim Saefullah', 'Gg. Babadan No. 629, Sukabumi 83900, Kaltara', 8826, NULL, NULL),
(46, 8, 'Naradi Widodo', 'PT Hartati', 'Kpg. Peta No. 135, Cimahi 96247, Kaltim', 8432, NULL, NULL),
(47, 2, 'Gabriella Restu Hastuti', 'PT Gunarto', 'Psr. Antapani Lama No. 648, Depok 51924, NTT', 8576, NULL, NULL),
(48, 5, 'Rachel Eli Oktaviani S.Pd', 'Perum Januar Wijayanti', 'Jr. Dipatiukur No. 149, Manado 96043, Bengkulu', 8086, NULL, NULL),
(49, 7, 'Digdaya Suwarno M.Ak', 'PT Natsir', 'Kpg. Banda No. 366, Bontang 94812, Kalsel', 8402, NULL, NULL),
(50, 2, 'Estiawan Umaya Adriansyah S.Kom', 'PT Lazuardi Mayasari (Persero) Tbk', 'Psr. Badak No. 151, Bandar Lampung 59705, Riau', 8816, NULL, NULL),
(51, 2, 'Umi Farida', 'CV Jailani Aryani Tbk', 'Jr. Otto No. 120, Lhokseumawe 48975, DIY', 8455, NULL, NULL),
(52, 9, 'Mahdi Maryadi M.Farm', 'PD Nuraini Saefullah', 'Gg. Gegerkalong Hilir No. 28, Tangerang 21632, Sulteng', 8421, NULL, NULL);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `kontak`
--
ALTER TABLE `kontak`
  ADD PRIMARY KEY (`idkontak`);

--
-- Indexes for table `siswa`
--
ALTER TABLE `siswa`
  ADD PRIMARY KEY (`idsiswa`);
COMMIT;

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Sampai di sini kita sudah punya table siswa dan kontak, tabel tersebut sudah terisi datanya sebagai contoh saja.

Baca Juga  Tutorial Javascript #10 : Fungsi pada JavaScript

Kemudian silahkan buat model untuk siswa dengan menggunakan php artisan :

php artisan make:model Siswa

Kemudian buka model Siswa yang sudah dibuat tersebut dan tambahkan sintak protected $table = “siswa”; dan buat method kontak(), sehingga sintak lengkapnya menjadi seperti berikut :

latihan_laravel/app/Models/Siswa.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Siswa extends Model
{
    use HasFactory; 
    protected $table = "siswa"; 
    protected $primaryKey = 'idsiswa';
    protected $fillable = ['idsiswa','nis','nama', 'kelas', 'alamat', 'hp'];
    
    public function kontak() 
    { 
        return $this->hasOne('App\Models\Kontak','idsiswa'); 
    }
}

Dengan protected $table = “siswa”; kita memberitahukan bahwa table yang digunakan adalah table “siswa”, bukan “siswas” (plural), bagian ini sudah dijelaskan pada tutorial sebelumnya tentang pembuatan model dan penamaan otomatisnya pada tutorial Eloquent. Pada model Siswa.php tersebut terdapat fungsi/method kontak(), yang memberitahukan model Siswa bahwa table siswa memiliki relasi 1 ke model atau table kontak.

Selanjutnya kita buat model baru untuk table kontak dengan php artisan dengan nama Kontak :

php artisan make:model Kontak

latihan_laravel/app/Models/Kontak.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Kontak extends Model
{
    use HasFactory;
    protected $table = "kontak";
    protected $primaryKey = 'idkontak';
    protected $fillable = ['idkontak', 'hp', 'idsiswa'];

    public function siswa()
    {
        return $this->belongsTo('App\Models\Siswa');
    }
}

Pada model Kontak ini, kita deklarasikan dulu bahwa table yang kita gunakan adalah table ‘kontak‘, bukan ‘kontaks‘.

protected $table = "kontak";

Kemudian kita buat fungsi untuk menjelaskan pada model Kontak, bahwa model Kontak terhubung dengan model Siswa.

public function siswa()
{
    return $this->belongsTo('App\Models\Siswa')
}

Perhatikan sebelumnya pada model Siswa, kita memberitahukan bahwa table siswa memiliki relasi 1 ke table kontak (hasOne), dan di model Kontak kita beritahu bahwa table kontak ini dimiliki oleh table siswa (belongsTo).

Jadi satu sama lain sudah terhubung sekarang, kedua table ini dihubungkan oleh kolum idsiswa yang ada pada table kontak, nama kolom idsiswa ini mengikuti nama table yang dihubungkan dengannya, jadi secara otomatis table kontak mencari idsiswa-nya masing-masing ke table siswa.

Baca Juga  Tutorial PHP : #8 Array Pada PHP

Fitur ini akan banyak kita butuhkan pada saat 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 bagaimana jenisnya one to one, one to many atau many to many.

Untuk melihat hasilnya, kita buat route “/siswa”, kita akan menampilkan data siswa dan data nomor hp masing-masing siswa pada route ini.

laravel_laravel/routes/web.php

Route::get('/siswa', 'SiswaController@index');

kemudian buat controller SiswaController.php menggunakan php artisan, masuk ke direktori project laravel kita dan ketik perintah :

php artisan make:controller SiswaController

Cara membuat controller pada laravel menggunakan php artisan sudah dijelaskan pada tutorial sebelumnya. Setelah membuat controller SiswaController.php, kemudian buat method index() di dalamnya.

latihan_laravel/app/Http/controllers/SiswaController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

// panggil model Siswa
use App\Models\Siswa;

class SiswaController extends Controller
{
    public function index() 
    { 
        // mengambil semua data siswa 
        $siswa = Siswa::all(); 
        
        // return data ke view 
        return view('siswa', ['siswa' => $siswa]); 
    }
}

Pada controller ini kita ambil data siswa dan kita return ke view siswa.blade.php, caranya masih sama seperti yang sudah kita pelajari sebelumnya.

Selanjutnya kita buat sebuah view untuk menampilkan data siswa, buat view sesuai dengan yang sudah kita tentukan pada controller yaitu view siswa.blade.php .

latihan_laravel/resources/views/siswa.blade.php

<!DOCTYPE html>
<html>

    <head>
        <title>Tutorial Laravel : 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.agussuratna.net">www.agussuratna.net</a></h3>
                    <h5 class="text-center my-4">Relasi One To One Eloquent</h5>
                    <table class="table table-bordered table-striped">
                        <thead>
                            <tr>
                                <th>No</th>
                                <th>NIS</th>
                                <th>Nama</th>
                                <th>Kelas</th>
                                <th>Alamat</th>
                                <th>HP</th>
                            </tr>
                        </thead>
                        <tbody> @foreach($siswa as $s) 
                            <tr>
                                <td>{{ $s->idsiswa }}</td>
                                <td>{{ $s->nis }}</td>
                                <td>{{ $s->nama }}</td>
                                <td>{{ $s->kelas }}</td>
                                <td>{{ $s->alamat }}</td>
                                <td>{{ $s->kontak->hp }}</td>
                            </tr> @endforeach </tbody>
                    </table>
                </div>
            </div>
        </div>
    </body>
</html>

Perhatikan pada view di atas, kita menampilkan data siswa menggunakan foreach :

@foreach($siswa as $s) 
    <tr>
        <td>{{ $s->idsiswa }}</td>
        <td>{{ $s->nis }}</td>
        <td>{{ $s->nama }}</td>
        <td>{{ $s->kelas }}</td>
        <td>{{ $s->alamat }}</td>
        <td>{{ $s->kontak->hp }}</td>
    </tr> 
@endforeach

Pada sintak tersebut kita bisa langsung mengakses data kontak dari data siswa.

<td>{{ $s->kontak->hp }}</td>

Hal ini bisa dilakukan karena kita sudah mendeklarasikan relasi one to one antara kedua table ini (model/table siswa dan model/table kontak). Dari variabel $s kita bisa langsung mengakses ke data kontak ($s->kontak) dan lebih spesifik lagi dengan memilih nama kolomnya ( $s->kontak->hp ).

Baca Juga  Tutorial Laravel #14 : Soft Deletes

Untuk melihat hasilnya kita jalankan projectnya dengan perintah :

php artisan serve

dan akses ke localhost:8000/siswa, maka hasilnya seperti berikut :

 

Relasi One To Many dengan Eloquent

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 kelas dan table jurusan. Satu jurusan bisa dimiliki oleh banyak kelas, dan banyak kelas bisa memiliki satu jurusan, jadinya one to many atau many to one (1 .. n atau n .. 1).

Perhatikan sedikit konsep relasi antar table laravel one to many berikut :

Di sini kita memiliki beberapa data pada table jurusan dan kita juga telah memiliki beberapa data pada table kelas, kedua table ini akan dihubungkan secara otomatis oleh kolum idjurusan yang ada pada table jurusan.

Maksudnya, idkelas diambil dari nama table (kelas) dan kolum (idkelas) pada table tersebut, hal ini sudah secara otomatis dijalankan oleh eloquent.

Seperti pada saat membuat contoh relasi one to one, kita membutuhkan model untuk kedua buah table tersebut, yaitu model Jurusan dan model Kelas.

Kita buat model jurusan dengan menggukan perintah :

php artisan make:model Jurusan

Karena sebelumnya kita membuat table dengan nama jurusan, kita harus mendeklarasikan protected $table = “jurusan”, supaya tidak dianggap table dengan nama jurusans (plural/jamak).

latihan_laravel/app/Models/Jurusan.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Jurusan extends Model
{
    use HasFactory;
    protected $table = "jurusan";
    protected $fillable = ['idjurusan', 'jurusan'];

    public function kelas()
    {
        return $this->hasMany('App\Models\Kelas','idjurusan');
    }
}

Perhatikan pada model Jurusan.php di atas, kita membuat fungsi untuk memberitahukan ke sistem bahwa kita akan membuat relasi Many ke model atau table kelas.

public function kelas()
{
    return $this->hasMany('App\Models\Kelas','idjurusan');
}

Kita mendeklarasikan table/model Jurusan ini dengan model/table Kelas, menggunakan fungsi return $this->hasMany(‘App\Models\Kelas’,’idjurusan’);, yang berarti kita memberitahukan bahwa jurusan bisa mempunyai banyak kelas, dengan nama field yang ada pada table kelas dengan nama ‘idjurusan’ yang di relasikan dengan table jurusan.

Selanjutnya kita akan membuat kebalikannya, buat model Kelas.php.

php artisan make:model Kelas

Kemudian tulis fungsi berikut :

latihan_laravel/app/Models/Tag.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Kelas extends Model
{
    use HasFactory;
    protected $table = "kelas";
    protected $primaryKey = 'idkelas';
    protected $fillable = ['idkelas', 'kelas', 'idjurusan'];

    public function jurusan()
    {
        return $this->belongsTo('App\Models\Jurusan');
    }
}

Pada model Kelas.php ini, kita deklarasikan bahwa table kelas ini dimiliki atau terhubung dengan model/table jurusan.

public function jurusan()
{
    return $this->belongsTo('App\Models\Jurusan');
}

Selanjutnya, kita akan mencoba menampilkan hasil dari contoh relasi one to many eloquent laravel ini, buat sebuah route baru.

latihan_laravel/routes/web.php

Route::get('/jurusan', 'JurusanController@index');

Route yang kita buat ini akan menjalankan method index() pada controller JurusanController. Buat controller JurusanController.php.

php artisan make:controller JurusanController

Selanjutnya buat method index() di dalamnya.

latihan_laravel/app/Http/controllers/JurusanController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

// panggil model Jurusan
use App\Models\Jurusan;


class JurusanController extends Controller
{
    public function index() 
    { 
        // mengambil semua data jurusan
        $jurusan = Jurusan::all(); 
        
        // return data ke view 
        return view('jurusan', ['jurusan' => $jurusan]); 
    }
}

Perhatikan pada method index() di atas, kita mencoba mengambil semua data dari table jurusan melalui model Jurusan dan kita passing datanya ke view jurusan.blade.php.

public function index() 
{ 
    // mengambil semua data Jurusan
    $siswa = Jurusan::all(); 
    
    // return data ke view 
    return view('jurusan', ['jurusan' => $jurusan]); 
}

Pada view jurusan.blade.php akan kita tampilkan semua data jurusan, lengkap dengan kelasnya masing-masing yang sudah kita hubungkan relasinya pada model Jurusan.php dan model Kelas.php.

Selanjutnya kita buat view jurusan.blade.php.

latihan_laravel/resources/views/jurusan.blade.php

<!DOCTYPE html>
<html>
    <head>
        <title>Tutorial Laravel : 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.agussuratna.net">www.agussuratna.net</a></h3>
                    <h5 class="text-center my-4">Eloquent One To Many Relationship</h5>
                    <table class="table table-bordered table-striped">
                        <thead>
                            <tr>
                                <th class="text-center">ID Jurusan</th>
                                <th class="text-center">Jurusan</th>
                                <th class="text-center">Kelas</th>
                                <th class="text-center">Jumlah Kelas</th>
                            </tr>
                        </thead>

                        <tbody>
                            @foreach ($jurusan as $j)
                                <tr>
                                    <td>{{ $j->idjurusan}}</td>
                                    <td>{{ $j->jurusan }}</td>
                                    <td>
                                        @foreach ($j->kelas as $k)
                                            {{ $k->kelas }},
                                        @endforeach
                                    </td>

                                    <td class="text-center">{{ $j->kelas->count() }}</td>
                                </tr>
                            @endforeach
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </body>
</html>

Kita lihat hasilnya dengan cara mengakses ke alamat localhost:8000/jurusan

Perhatikan sintak di atas, kita bisa langsung mengakses data kelas untuk masing-masing jurusan.

<td>
    @foreach ($j->kelas as $k)
        {{ $k->kelas }}
    @endforeach
</td>

<td class="text-center">{{ $j->kelas->count() }}</td>

Untuk menghitung jumlah kelas masing-masing jurusan, kita bisa langsung menggunakan fungsi count() seperti yang ada pada contoh di atas.

 

Demikian tutorial mengenai Relasi Database dengan Eloquent, jika ada pertanyaan silahkan tuliskan di kolom komentar. Semoga bermanfaat

Referensi :

  • https://informatika.uc.ac.id/id/2019/12/laravel-database-relationship/

Related Post

1 Trackback / Pingback

  1. Membuat Aplikasi Perpustakaan Berbasis Web dengan Laravel dan Bootstrap - agussuratna.net

Leave a Reply

Your email address will not be published.


*


error: Ga bisa dicopy