CRUD | JOIN : Menghubungkan dua Buah Tabel pada Laravel

Barintek
0


         Nah, setelah kita tuntas membahas CRUD (Create, Read, Update, Delete) di laravel. Kita juga sudah praktekan dengan sebuah projek bernama "agenda" dimana di dalam agenda tersebut terdapat dua buah tabel. Kita juga sudah menampilkan, serta melakukan perubahan pada tabel tema.  Sql sendiri memiliki code untuk menggabungkan du tabel dengan perintah join yang di sederhanakan oleh laravel menjadi dua perintah belongTo dan hasMany.
    Metode join dengan belongsTo dan hasMany adalah dua dari banyak metode yang digunakan di Laravel Eloquent untuk mendefinisikan hubungan (relasi) antara tabel-tabel di database Anda. Metode-metode ini membantu Anda melakukan operasi join tanpa harus menulis kueri SQL secara manual.
Secara sederhana:
  • belongsTo (Milik Satu): Digunakan untuk mendefinisikan hubungan di mana satu model "anak" adalah milik satu model "induk" (hubungan satu-ke-satu atau satu-ke-banyak). Ini biasanya digunakan pada model yang memiliki kunci asing (foreign key).
  • hasMany (Memiliki Banyak): Digunakan untuk mendefinisikan hubungan di mana satu model "induk" dapat memiliki banyak model "anak". Ini biasanya digunakan pada model yang merupakan pemilik kunci utama yang direferensikan oleh model lain.
    Lalu bagaimana memakainya. Jadi untuk tabel kegiatan (Jika anda sudah membuatnya, namun jika belum disini kita akan membuatnya) terdapat data tema juga. Perhatikan field-nya => id_kegiatan, id_tema, waktu, judul, keterangan, foto. Field id_tema yang merupakan primary_key di tabel tema. Berdasarkan field ini kita akan memanggil tabel tema dan menampilkan tema tersebut di dalam tabel kegiatan. Oke mari kita mulai

Persiapan Awal
    Pastikan anda sudah memiliki route untuk kegiatan seperti berikut:

//route kegiatan
Route::resource('kegiatan', KegiatanController::class);   
      Route ini memberikan jalur untuk semua jalur seperti yang sudah dibahas sebelumnya.
    Pastikan juga anda sudah memiliki model dengan nama KegiatanModel.php dengan script seperti berikut:

class KegiatanModel extends Model
{
    use HasFactory;
    protected $table = 'kegiatans';
    protected $primaryKey = 'id_kegiatan';
    protected $fillable = [
        'id_tema',
        'waktu',
        'judul',
        'keterangan',
        'foto'
    ];
}


    Jangan lupa membuat controller dengan nama KegiatanController.php. Berikut bentuk codenya:

<?php

namespace App\Http\Controllers;

use App\Models\KegiatanModel;
use Illuminate\Http\Request;

class KegiatanController extends Controller
{
    public function index()
    {
        $data = [
            'kegiatans' => KegiatanModel::all()
        ];
        return view('kegiatan', $data);
    }
}


    Selanjutnya buat view dengan nama kegitan.blade.php

@extends('templates.tem_main')
@section('main')
    <div class="container mt-5">
        <h2 class="mb-4">Daftar Kegiatan</h2>
        <div class="d-flex justify-content-end mb-3">
            <a href="{{ route('kegiatan.create') }}" class="btn btn-primary">
                <i class="bi bi-plus-circle-fill me-2"></i>Tambah
                Kegitan </a>
        </div>
        <table id="myTable" class="table table-striped table-bordered" style="width:100%">
            <thead>
                <tr>
                    <th><i class="bi bi-hashtag"></i> NO</th>
                    <th><i class="bi bi-tag-fill"></i> TEMA</th>
                    <th><i class="bi bi-tag-fill"></i> WAKTU</th>
                    <th><i class="bi bi-tag-fill"></i> JUDUL</th>
                    <th><i class="bi bi-chat-left-text"></i> KETERANGAN</th>
                    <th><i class="bi bi-tag-fill"></i> FOTO</th>
                    <th><i class="bi bi-gear-fill"></i> Aksi</th>
                </tr>
            </thead>
            <tbody>
                @php $no = 1; @endphp
                @foreach ($kegiatans as $kegiatan)
                    <tr>
                        <td>{{ $no++ }}</td>
                        <td>{{ $kegiatan->id_tema }}</td>
                        <td>{{ $kegiatan->waktu ?? '' }}</td>
                        <td>{{ $kegiatan->judul ?? '' }}</td>
                        <td>{{ $kegiatan->keterangan }}</td>
                        <td>{{ $kegiatan->foto }} </td>
                        <td>
                            <a href="{{ route('kegiatan.edit', $kegiatan->id_kegiatan) }}"
                                class="btn btn-warning btn-sm me-2"><i class="bi bi-pencil-square"></i>
                                Edit</a>
                            <button type="submit" class="btn btn-danger btn-sm">
                                <i class="bi bi-trash"></i> Hapus
                            </button>
                        </td>
                    </tr>
                @endforeach
            </tbody>
        </table>
    </div>
@endsection

    
    Terakhir pastikan link di tem_main.blade.php sudah anda buat juga:
<a class="nav-link" href="{{ route('kegiatan.index') }}">
    <i class="bi bi-activity"></i> Kegiatan
</a>

    Berikut Hasilnya:




Join Tabel Kegiatan Dan Tema
    
    Jika persiapan di atas sudah beres saatnya kita join tabel. perhatikan pada field Tema yang muncul adalah id_tema, sedangkan yang kita inginkan adalah yang muncul seharusnya tema. Oke masuk ke halaman KegitanModel. Tambahkan function ini:
....
protected $fillable = [
    'id_tema',
    'waktu',
    'judul',
    'keterangan',
    'foto'
];
public function joinTema()
{
    return $this->belongsTo(TemaModel::class, 'id_tema', 'id_tema');
}
    
    Terdapat metode belongsTo yang kita gunakan di dalam fungsi ini. Artinya nanti dimana id_tema hanya memiliki 1 nilai saja. Selanjutnya tambah juga function joinTema() di model TemaModel
....
use HasFactory;
protected $table = 'temas';
protected $primaryKey = 'id_tema';
protected $fillable = ['tema', 'keterangan'];

public function joinTema()
{
    return $this->hasMany(KegiatanModel::class, 'id_tema', 'id_tema');
}

    Model yang digunakan nanti disini dalah hasMany, artinya id_tema yang ada di dalam filed Kegiatan memiliki banyak nilai. Sedangkan nama fungsi kita buat sama, yaitu joinTema(). 

    Buka KegiatanController dan edit code di fungsi index() seperti berikut:
public function index()
{
    $data = [
        'kegiatans' => KegiatanModel::with('joinTema')->get()
    ];
    return view('kegiatan', $data);
}

    Perubahan pada code ini adalah kita menambahkan metode with kemudian kita memanggil funbsi joinTema yang telah kita buat sebelumnya. Terakhir kita rubah view di kegiatan.blade.php. 
<tr>
    <td>{{ $no++ }}</td>
    <td>{{ $kegiatan->joinTema->tema }}</td>
    <td>{{ $kegiatan->waktu ?? '' }}</td>
.....
</td>

    Anda dapat lihat, kita mengganti id_tema menjadi tema dengan di sertakan nama fungsi joinTema.    

    Terakhir coba jalankan. Apakah tema sudah muncul?  Jika semua berjalan lancar seharusnya id_tema yang muncul tadi sudah digantikan dengan nama tema. Selamat bekerja.


 

        

Tags

Posting Komentar

0Komentar

Posting Komentar (0)