#21-Laravel-Eloquent Relation Many to Many

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 members
  • table gifts
  • table gift_member

Table members kita gunakan untuk menyimpan data-data member, table gifts untuk menyimpan data-data hadiah.

dan pasti teman-teman bertanya untuk apa kita membuat table gift_member ? untuk apa gunanya? dan kenapa harus diberi nama dengan gift_member? kenapa bukan member_gift atau yang lainnya?

Karena kita akan menghubungkan table member dan table gift. dan yang menjadi penghubungnya adalah table gift_member.

di sini table gift_member 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 gift_member ? kenapa bukan member_gift?

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 G lebih dulu dari pada huruf M, maka jadinya anggota_hadiah.

Pada tahap ini kita akan membuat table members, table gifts, dan table gift_member.

many to many

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.

Dengan Kondisi di atas saya asumsikan sekarang data members dan gifts sudah terisi, sekarang kita tinggal membuat data untuk gift_member

Buat Model

Model Member

php artisan make:model Member
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Member extends Model
{
    protected $table = "members";
    
    protected $fillable = ['fullname'];

    public function gift()
    {
    	return $this->belongsToMany('App\Gift');
    }
}

Model Gift

php artisan make:model Gift
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Gift extends Model
{
    protected $table = "gifts";
 
    public function gift()
    {
    	return $this->belongsToMany('App\Gift');
    }
}

Model Gift Member

php artisan make:model GiftMember
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class GiftMember extends Model
{
    protected $table = "gift_member";
    
    protected $fillable = ['gift_id','member_id'];
    
}

Buat Controller App/Http/GiftMemberController.php

php artisan make:controller GiftMemberController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Gift;
use App\Member;
use App\GiftMember;

class GiftMemberController extends Controller
{
    public function index()
    {
    	$member = Member::paginate(5);
        $data['title']='Data Member';
        $data['data']=$member;
    	return view('giftmember', $data);
    }
    public function search(Request $request){
		$search_fullname = $request->search_fullname;
        $member=Member::when($search_fullname, function ($query, $search_fullname) {
                    return $query->where('fullname','like',"%".$search_fullname."%");
                })
            ->paginate(5);
		$data['data'] = $member;
        $data['title']="Hasil Pencarian ..";
		return view('giftmember',$data);
	}
    public function create(Request $request){
        if($request->btnSubmit){
            $this->validate($request,[
                'gift_id' => 'required',
                'member_id' => 'required',
            ]);
            
            GiftMember::create([
                'gift_id' => $request->gift_id,
                'member_id' => $request->member_id,
            ]);
            return redirect('/giftmember');
        }
        $data['title']='Tambah Gift';
        return view('giftmember_form', $data);
    }
    public function edit(Request $request, $id){
        if($request->btnSubmit){
            $this->validate($request,[
                'gift_id' => 'required',
                'member_id' => 'required',
            ]);
            $giftmember = GiftMember::find($id);
            $giftmember->gift_id = $request->gift_id;
            $giftmember->member_id = $request->member_id;
            $giftmember->save();
            return redirect('/giftmember');
        }
        $data['title']='Ubah Member';
        $data['edit']= GiftMember::find($id);
        return view('giftmember_form', $data);
    }
    public function delete($id){
        $giftmember = GiftMember::find($id);
        $giftmember->delete();
        return redirect(url()->previous());
    }
}

Buat Template

Master Template resources/views/template.blade.php

<html>
    <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <meta name="csrf-token" content="{{ csrf_token() }}">
        <title>{{$title}}</title>
        <link rel="stylesheet" type="text/css" href="{{ asset('/css/app.css') }}">
    </head>
    <body>
        <div class="container-fluid">
            @yield('main')
        </div>
        <footer class="container-fluid">
            <p>&copy; <a href="https://ombagoes.com">ombagoes.com</a>. 2019 - 2020</p>
        </footer>
    </body>
    <script src="{{ asset('js/app.js') }}"></script>
</html>

Data Member dan Navigasi CRUD resources/views/giftmember.blade.php

@extends('template')
@section('main')
<div class="card mt-5">
    <div class="card-header text-center">
        {{$title}}
    </div>
    <div class="card-body">
        <a href="{{url()->current()}}/create" class="btn btn-primary">Tambah Baru</a>
        <br/>
        <br/>
        <p>Cari :</p>
        <form class="form-inline" action="/giftmember/search" method="GET">
            <label class="sr-only" for="inlineFormInputFullname">Nama Lengkap</label>
            <input name="search_fullname" type="text" class="form-control mb-2 mr-sm-2" id="inlineFormInputFullname" placeholder="Nama Lengkap .." value="{{ old('search_fullname') }}">
            <button type="submit" class="btn btn-primary mb-2">Submit</button>
        </form>
        <table class="table table-bordered table-hover table-striped">
            <thead>
                <tr>
                    <th>Nama</th>
                    <th width="400px">Hadiah</th>
                </tr>
            </thead>
            <tbody>
                @foreach($data as $row)
                <tr>
                    <td>{{ $row->fullname }}</td>
                    <td><ul>
                            @foreach($row->gift as $g)
                            <li>
                                {{ $g->gift_name }}
                                <a href="{{url()->current()}}/edit/{{ $g->id }}" class="btn btn-warning">Ubah</a>
                                <a href="{{url()->current()}}/delete/{{ $g->id }}" class="btn btn-danger">Hapus</a>
                                <hr/>
                            </li>
                            @endforeach
                        </ul>
                    </td>
                </tr>
                @endforeach
            </tbody>
        </table>
        <br/>
        Halaman : {{ $data->currentPage() }} <br/>
        Jumlah Data : {{ $data->total() }} <br/>
        Data Per Halaman : {{ $data->perPage() }} <br/>
    
    
        {{ $data->links() }}
    </div>
</div>
@endsection

Form Create/Edit resources/views/giftmember_form.blade.php

@extends('template')
@section('main')
<div class="card mt-5">
    <div class="card-header text-center">
        {{$title}}
    </div>
    <div class="card-body">
        <a href="/giftmember" class="btn btn-primary">Kembali</a>
        <br/>
        <br/>
        
        <form method="post" action="{{url()->current()}}">
            {{ csrf_field() }}
            
            <div class="form-group">
                <label>Nama Lengkap</label>
                <select class="form-control" name="member_id">
                <option>Select Member</option> 
                @foreach (App\Member::select('id','fullname')->get() as $member)
                    <option value="{{ $member->id }}" {{ ( $member->id == @$edit->member_id) ? 'selected' : '' }}> 
                        {{ $member->fullname }} 
                    </option>
                @endforeach    
                </select>

                @if($errors->has('member_id'))
                    <div class="text-danger">
                        {{ $errors->first('member_id')}}
                    </div>
                @endif

            </div>
            <div class="form-group">
                <label>Hadiah</label>
                <select class="form-control" name="gift_id">
                <option>Pilih</option> 
                @foreach (App\Gift::select('id','gift_name')->get() as $gift)
                    <option value="{{ $gift->id }}" {{ ( $gift->id == @$edit->gift_id) ? 'selected' : '' }}> 
                        {{ $gift->gift_name }} 
                    </option>
                @endforeach    
                </select>

                @if($errors->has('gift_id'))
                    <div class="text-danger">
                        {{ $errors->first('gift_id')}}
                    </div>
                @endif
                
            </div>

            <div class="form-group">
                <input name="btnSubmit" type="submit" class="btn btn-success" value="Simpan">
            </div>

        </form>

    </div>
</div>
@endsection
Member Many to Many

Simulasikan Tambah beberapa Gift untuk Member. Pada gambar di atas kita dapat melihat bahwa satu Member bisa mendapatkan banyak jenis Gift dan Satu jenis Gift bisa didapatkan oleh banyak Member dalam artian kondisi Relasi Many to Many terpenuhi.

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>