Introducing Eloquent



             Assalamualaikum wr wb, sebelumnya kita telah menyelesaikan CRUD Data menggunakan DB Facade. Nah pada blog kali ini saya akan memberikan penjelasan mengenai cara yang lain untuk berinteraksi dengan Database. Jika belum tau di laravel ini ada dua cara untuk berinteraksi dengan Database yaitu ada Query Builder (DB Facades) dan Eloquent ORM. Untuk blog kali ini saya akan menjelaskan mengenaik Eloquent ORM. Sebelum itu siapkan dulu seperti biasa text editor , project Laravel kemarin, xampp, dan browser. Langsung saja ke penjelasannya


Eloquent ORM 

Eloquent adalah sebuah ORM (Object Relational Mapping) yang artinya eloquent ini dapat membantu memetakan sebuah object dengan database dan juga dapat mempermudah user berinteraksi dengan database. Eloquent ini hampir sama dengan Query Builder, kita tidak perlu lagi mengetik query mysql secara lengkap, tetapi kita akan menggunakan fungsi fungsi yang sudah disediakan. Tetapi Eloquent ini akan mengimplementasikan sebuah object (Model) yang nantinya akan mempermudah saat berinteraksi dengan database.


Implementasi 

setelah mengetahui arti dan sebagainya. Langsung saja kita ke tahap implementasiannya di tabel siswa.

1. Langkah Pertama 

Buat model baru pada folder app dengan nama Siswa.php. Cara agar mudah nya menggunakan php artisan dengan command "php artisan make:model Siswa". Setelah model Siswa dibuat, masukan kodingan dibawah ini.


Penjelasan : 

$table -> Variabel untuk menentukan nama tabel pada database untuk model ini

$fillable -> Variabel untuk menentukan field apa saja yang akan di-fill / di-insert ke tabel pada model ini. Biasanya digunakan untuk mass-assignment


Langkah Kedua

Modifikasi file SiswaController.php menjadi kodingan di bawah ini

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Siswa;

class SiswaController extends Controller {


// |--------------------------------------------------------------------------
// | CRUD With Eloquent
// |--------------------------------------------------------------------------
    
    public function index() {
        $data['siswa'] = Siswa::orderBy('nis')->get();
        return view('siswa'$data);
    }
    
    public function create() {
        return view('form.form-siswa');
    }

    // Function Store Cara 1
    // public function store(Request $request) {
        
    //     $rule = [
    //         'nis' => 'required|numeric|unique:t_siswa,nis',
    //         'nama_lengkap' => 'required|string',
    //         'jenis_kelamin' => 'required',
    //         'golongan_darah' => 'required',
    //     ];
    //     $this->validate($request, $rule);
        
    //     $input = $request->all();        
    //     $status = Siswa::create($input);

    //     if ($status) {
    //         return redirect('/data-siswa')->with('success','Data Berhasil Ditambahkan');
    //     } else {
    //         return redirect('/create-siswa')->with('error','Data Gagal Ditambahkan');
    //     }

    // }

    public function store(Request $request) {
        
        $rule = [
            'nis' => 'required|numeric|unique:t_siswa,nis',
            'nama_lengkap' => 'required|string',
            'jenis_kelamin' => 'required',
            'golongan_darah' => 'required',
        ];
        $this->validate($request$rule);
        
        $input = $request->all();

        $siswa = new Siswa;
        $siswa->nis = $input['nis'];
        $siswa->nama_lengkap = $input['nama_lengkap'];
        $siswa->jenis_kelamin = $input['jenis_kelamin'];
        $siswa->golongan_darah = $input['golongan_darah'];
        $status = $siswa->save();

        if ($status) {
            return redirect('/data-siswa')->with('success','Data Berhasil Ditambahkan');
        } else {
            return redirect('/create-siswa')->with('error','Data Gagal Ditambahkan');
        }

    }        

    public function edit(Request $request, $id) {

        $data['siswa'] = Siswa::find($id);
        return view ('form.form-siswa'$data);        

    }

    // Function Update Cara 2
    // public function update(Request $request, $id) {
        
    //     $rule = [
    //         'nama_lengkap' => 'required|string',
    //         'jenis_kelamin' => 'required',
    //         'golongan_darah' => 'required',
    //     ];
    //     $this->validate($request, $rule);

    //     $input = $request->all();
    //     $siswa = Siswa::find($id);
    //     $status = $siswa->update($input);

    //     if ($status) {
    //         return redirect('/data-siswa')->with('success','Data Berhasil Diupdate');
    //     } else {
    //         return redirect('/create-siswa')->with('error','Data Gagal Diupdate');
    //     }

    // }

    public function update(Request $request, $id) {
        
        $rule = [
            'nama_lengkap' => 'required|string',
            'jenis_kelamin' => 'required',
            'golongan_darah' => 'required',
        ];
        $this->validate($request$rule);

        $input = $request->all();
        $siswa = Siswa::find($id);
        $siswa->nis = $input['nis'];
        $siswa->nama_lengkap = $input['nama_lengkap'];
        $siswa->jenis_kelamin = $input['jenis_kelamin'];
        $siswa->golongan_darah = $input['golongan_darah'];
        $status = $siswa->update();

        if ($status) {
            return redirect('/data-siswa')->with('success','Data Berhasil Diupdate');
        } else {
            return redirect('/create-siswa')->with('error','Data Gagal Diupdate');
        }

    }

    public function destroy(Request $request, $id) {
        
        $siswa = Siswa::find($id);
        $status = $siswa->delete();

        if ($status) {
            return redirect('/data-siswa')->with('success','Data Berhasil Dihapus');
        } else {
            return redirect('/create-siswa')->with('error','Data Gagal Dihapus');
        }
    }

Penjelasan :

Siswa::find($id)

Method find hanya ada pada Eloquent Model, digunakan untuk mencari data pada model berdasarkan primary key. Biasanya primary key yang dicari adalah id. Selain id anda dapat mengaturnya pada model dengan meng-override variabel public $primaryKey
Jika dalam Query SQL, fungsi diatas akan menciptakan query sebagai berikut:
SELECT * FROM t_siswa WHERE id = ‘$id’.


Studi Kasus 



A. Studi Kasus 6.1 

buat model di folder App dengan nama Kelas. untuk mudahnya gunakan saja php artisan dengan command "php artisan make:model Kelas". Setelah dibuat masukan kodingan di bawah ini di model Kelas.php


ubah file KelasController.php menjadi kodingan di bawah ini

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Kelas;

class KelasController extends Controller
{

// |--------------------------------------------------------------------------
// | CRUD With Eloquent
// |--------------------------------------------------------------------------

    public function index() {
        $data['kelas'] = Kelas::get();        
        return view('kelas',$data);
    }

    public function create() {
        return view('form.form-kelas');
    }

    public function store(Request $request) { 
        
        $rule = [
            'nama_kelas' => 'bail|required|string|unique:t_kelas,nama_kelas',
            'jurusan' => 'required|string',
            'lokasi_lab' => 'required|string',
            'nama_wali_kelas' => 'required|string',
        ];
        $this->validate($request$rule);
        
        $input = $request->all();
        $kelas = new Kelas;
        $kelas->nama_kelas = $input['nama_kelas'];
        $kelas->jurusan = $input['jurusan'];
        $kelas->lokasi_lab = $input['lokasi_lab'];
        $kelas->nama_wali_kelas = $input['nama_wali_kelas'];
        $status = $kelas->save();

        if ($status) {
            return redirect('/data-kelas')->with('success','Data Berhasil Ditambahkan');
        } else {
            return redirect('/create-kelas')->with('error','Data Gagal Ditambahkan');
        }
    }

    public function edit(Request $request, $id) {

        $data['kelas'] = Kelas::find($id);
        return view ('form.form-kelas'$data);         

    }

    public function update(Request $request, $id) {
        
        $rule = [
            'jurusan' => 'required|string',
            'lokasi_lab' => 'required|string',
            'nama_wali_kelas' => 'required|string',
        ];
        $this->validate($request$rule);

        $input = $request->all();
        $kelas = Kelas::find($id);
        $kelas->nama_kelas = $input['nama_kelas'];
        $kelas->jurusan = $input['jurusan'];
        $kelas->lokasi_lab = $input['lokasi_lab'];
        $kelas->nama_wali_kelas = $input['nama_wali_kelas'];
        $status = $kelas->update();

        if ($status) {
            return redirect('/data-kelas')->with('success','Data Berhasil Diupdate');
        } else {
            return redirect('/create-kelas')->with('error','Data Gagal Diupdate');
        }

    }

    public function destroy(Request $request, $id) {

        $kelas = Kelas::find($id);
        $status = $kelas->delete();

        if ($status) {
            return redirect('/data-kelas')->with('success','Data Berhasil Dihapus');
        } else {
            return redirect('/create-kelas')->with('error','Data Gagal Dihapus');
        }
}



B. Studi Kasus 6.2

Buat Migration untuk tabel t_guru, dengan menggunakan command di bawah ini



setelah migrasi dibuat, masukan kodingan di bawah ini ke dalam file migrasi tersebut. setelah itu migrate dengan command 'php artisan migrate'


<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateTGuru extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('t_guru'function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('nip');
            $table->string('nama_guru',100);
            $table->string('jenis_kelamin',1);
            $table->string('no_hp');
            $table->string('alamat',150);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('t_guru');
    }
}

setelah berhasil di migrate maka akan muncul tabel t_guru dengan tampilan berikut



File view untuk CRUD Data Guru

guru.blade.php

<center>
    <div class="card mt-5 mb-5" style="width:80%">
        <div class="card-header">
            <div class="row">
                <h2 style="margin-left:340px; margin-right:290px;" class="text-info">Data Guru SMK Negeri 4 Bandung</h2>
                <a href="{{ url('create-guru') }}"><i class="fas fa-user-plus fa-2x mt-2"></i></a>
            </div>
        </div>
        <div class="card-body">
        @if(session('success'))
            <div class="alert alert-success">
                <i class="far fa-check-circle"></i>
                {{ session('success') }}
            </div>
        @endif
        @if(session('error'))
            <div class="alert alert-error">
                <i class="far fa-times-circle"></i>
                {{ session('error') }} 
            </div>
        @endif
        <div class="table-responsive">
            <table class="table table-bordered text-center" id="dataTable" border="1" cellspacing="0" cellpadding="10" width="100%">
                <thead>
                    <tr align="center" class="text-dark">
                        <th>No</th>
                        <th>Foto</th>
                        <th>NIP</th>
                        <th>Nama Lengkap</th>
                        <th>Gender</th>
                        <th>No Handphone</th>
                        <th>Alamat</th>
                        <th>Action</th>
                    </tr>
                </thead>
                @foreach ($guru as $row)
                <tr align="center">
                    <td>{{$loop->iteration}}</td>
                    <td width="60"><img src="/image/{{ $row->jenis_kelamin == 'L' ? 'ava.png' : 'ava2.png' }}" width="90%"></td>
                    <td>{{$row->nip}}</td>
                    <td>{{$row->nama_guru}}</td>
                    <td width="120">{{$row->jenis_kelamin}}</td>
                    <td width="140">{{$row->no_hp}}</td>
                    <td>{{$row->alamat}}</td>
                    <td width="230">
                        <div class="row">                        
                        <div class="col-6">
                            <a href="{{ url('/data-guru/' . $row->id . '/edit') }}" class="btn btn-warning" style="width:100px;" ><i class="fas fa-edit mr-1"></i>Edit</a>
                        </div>
                        <div class="col-6">
                            <form action="{{ url('/data-guru', $row->id) }}" method="POST">
                                @method('DELETE')
                                @csrf
                                <button type="submit" class="btn btn-danger"style="width:100px;" onclick="return confirm('Yakin akan menghapus data ini ?');">
                                    <i class="fas fa-trash-alt mr-1"></i>Delete
                                </button>
                            </form>
                        </div>                        
                        </div>
                    </td>
                </tr>
                @endforeach        
            </table>
        </div>
        </div>
    </div>
</center>        

form-guru.blade.php

<div class="card" style="width:50%; margin:auto;">
        <div class="card-header">
            <h2 class="text-info">Tambah Data Guru</h2>
        </div>
        <div class="card-body">
        @if(session('error'))
            <div class="alert alert-error">
                <i class="far fa-times-circle"></i>
                {{ session('error') }}
            </div> 
        @endif

        @if (count($errors) > 0)
            <div class="alert alert-danger">                
                <strong><i class="fas fa-exclamation-triangle text-warning"></i>&nbsp;Perhatian</strong>
                <br>
                <ul>
                    @foreach ($errors->all() as $error)
                    <li>{{ $error }}</li>
                    @endforeach
                </ul>
            </div>
        @endif
            <form action="{{ url('data-guru', @$guru->id) }}" method="POST">            
                
                @csrf                

                @if (!empty($guru))
                    @method('PATCH')                    
                @endif                
                
                <div class="form-group">
                    <label for="nip" class="text-dark">NIP</label>
                    <input type="text" class="form-control" id="nip" name="nip" value="{{ old('nip', @$guru->nip) }}">                    
                </div>
                <div class="form-group">
                    <label for="nama_guru" class="text-dark">Nama Lengkap</label>
                    <input type="text" class="form-control" id="nama_guru" name="nama_guru" value="{{ old('nama_guru', @$guru->nama_guru) }}">                    
                </div>
                <div class="form-group">
                    <label class="text-dark">Jenis Kelamin</label>
                    <div class="custom-control custom-radio">
                        <input type="radio" id="jenis_kelaminL" name="jenis_kelamin" class="custom-control-input" value="L" {{ old('jenis_kelamin', @$guru->jenis_kelamin)=='L' ? 'checked' : '' }}>
                        <label class="custom-control-label text-dark" for="jenis_kelaminL">Laki - Laki</label>                        
                    </div>
                    <div class="custom-control custom-radio">
                        <input type="radio" id="jenis_kelaminP" name="jenis_kelamin" class="custom-control-input" value="P" {{ old('jenis_kelamin', @$guru->jenis_kelamin)=='P' ? 'checked' : '' }}>
                        <label class="custom-control-label text-dark" for="jenis_kelaminP">Perempuan</label>                        
                    </div>
                </div>
                <div class="form-group">
                    <label for="no_hp" class="text-dark">No Handphone</label>
                    <input type="text" class="form-control" id="no_hp" name="no_hp" value="{{ old('no_hp', @$guru->no_hp) }}">                    
                </div>
                <div class="form-group">
                    <label for="alamat">Alamat</label>        
                    <textarea class="form-control" id="alamat" name="alamat" rows="3" >{{ old('alamat', @$guru->alamat) }}</textarea>
                </div>
                <input type="submit" value="Simpan" class="btn btn-success mt-3" style="width:80px;">
                <a href="{{ route('guru') }}" class="btn btn-secondary mt-3" style="width:80px;">Back</a>
            </form>
        </div>
    </div>

Buat file controller dengan command "php artisan make:controller GuruController". dan masukan kodingan di bawah ini

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Guru;

class GuruController extends Controller
{
    public function index() {
        $data['guru'] = Guru::get();        
        return view('guru',$data);
    }

    public function create() {
        return view('form.form-guru');
    }

    public function store(Request $request) { 
        
        $rule = [
            'nip' => 'bail|required|string|unique:t_guru,nip',
            'nama_guru' => 'required|string',
            'jenis_kelamin' => 'required|string',
            'no_hp' => 'required|numeric',
            'alamat' => 'required|string',
        ];
        $this->validate($request$rule);
        
        $input = $request->all();
        $guru = new Guru;
        $guru->nip = $input['nip'];
        $guru->nama_guru = $input['nama_guru'];
        $guru->jenis_kelamin = $input['jenis_kelamin'];
        $guru->no_hp = $input['no_hp'];
        $guru->alamat = $input['alamat'];
        $status = $guru->save();

        if ($status) {
            return redirect('/data-guru')->with('success','Data Berhasil Ditambahkan');
        } else {
            return redirect('/create-guru')->with('error','Data Gagal Ditambahkan');
        }
    }

    public function edit(Request $request, $id) {

        $data['guru'] = Guru::find($id);
        return view ('form.form-guru'$data);         

    }

    public function update(Request $request, $id) {
        
        $rule = [
            'nip' => 'bail|required|string',
            'nama_guru' => 'required|string',
            'jenis_kelamin' => 'required|string',
            'no_hp' => 'required|numeric',
            'alamat' => 'required|string',
        ];
        $this->validate($request$rule);

        $input = $request->all();
        $guru = Guru::find($id);
        $guru->nip = $input['nip'];
        $guru->nama_guru = $input['nama_guru'];
        $guru->jenis_kelamin = $input['jenis_kelamin'];
        $guru->no_hp = $input['no_hp'];
        $guru->alamat = $input['alamat'];
        $status = $guru->update();

        if ($status) {
            return redirect('/data-guru')->with('success','Data Berhasil Diupdate');
        } else {
            return redirect('/create-guru')->with('error','Data Gagal Diupdate');
        }

    }

    public function destroy(Request $request, $id) {

        $guru = Guru::find($id);
        $status = $guru->delete();

        if ($status) {
            return redirect('/data-guru')->with('success','Data Berhasil Dihapus');
        } else {
            return redirect('/create-guru')->with('error','Data Gagal Dihapus');
        }
    }

}

Buat model dengan nama Guru.php di folder App. dan masukan kodingan di bawah ini



Hasil Untuk CRUD Data Guru dengan Eloquent



C. Studi Kasus 6.3

Untuk perbedaannya saya akan kasih satu perbandingan fungsi yaitu update

DB Facade





DB Facade tidak memiliki model, sehingga secara manual kita harus mengetikkan table mana yang akan digunakan setiap kita membuat fungsi query di laravel nya. Intinya DB Facades berinteraksi langsung ke Database, layaknya Query. Itulah kenapa DB Facades biasa disebut Query Builder


Eloquent ORM



Eloquent membuat interaksi dengan database lebih mudah, karena setiap table pada database dibuat class khusus untuk setting atau untuk mengatur table nya mulai dari menentukan table apa yang akan digunakan oleh class model nya, mengatur apa saja column yang boleh diisi dan yang tidak diisi, dan dapat mengisi timestamp sendiri (created_at dan updated_at). Intinya Eloquent lebih ke menyambungkan model dengan Database, itulah kenapa sebelum menjalankan Eloquent, Admin membuat model Siswa.php didalam folder App



Sekian materi yang dapat saya jelaskan  mengenai Eloquent ORM di Laravel ini. Semoga bermanfaat untuk teman teman semua yang membaca blog ini dan semoga bisa berguna jika teman teman mengalami kesulitan saat membuat aplikasi web menggunakan Laravel. Mohon maaf jika banyak kesalahan saya akan terus memperbaikinya. Wassalamualaikum wr wb.