Programming

CRUD Laravel 8 dengan Repository Pattern dan Yajra Datatables

yajra crud laravel

Repository pattern dalam penggunaannya sangat membantu programmer dalam mempermudah manajemen kode dan juga dokumentasi. Selain itu, pada tutorial ini kita juga akan menggunakan datatable Yajra yang digunakan untuk menampilkan list data. Berikut akan kita bahas tahapan pembuatan CRUD menggunakan repository class untuk membuat menu hari libur.

1. Yajra Datatables

Disini kita akan menggunakan fresh project yang baru dibuat di artikel install laravel 8 di laradock. Sebelum kita membuat file CRUD, kita tambahkan library Yajra di aplikasi dengan membuka file composer.json, lalu tambahkan di bagian require : "yajra/laravel-datatables-oracle": "~9.0" Setelah selesai, buka terminal atau bash docker, masuk ke folder aplikasi lalu ketik perintah : composer update. Composer akan melakukan download library yajra agar dapat dipakai di aplikasi. Tunggu hingga proses update selesai.

install yajra in laravel

A. Halaman Utama

A.1 Database

Pada halaman utama ini, akan ditampilkan list/daftar data hari libur yang telah diinput pada sistem. Terkait database, silahkan dibuat dengan query berikut :

CREATE TABLE `holiday` (
  `id` int NOT NULL,
  `holiday_date` date NOT NULL,
  `note` varchar(100) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `holiday` ADD PRIMARY KEY (`id`);

ALTER TABLE `holiday` MODIFY `id` int NOT NULL AUTO_INCREMENT;

Tampilan yang akan dibuat seperti gambar di bawah ini.

yajra laravel

A.2 Controller Halaman Utama

Selanjutnya membuat file controller dengan nama HolidayController.php dengan isi file sebagai berikut :

namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Session;
use DataTables;
use Illuminate\Support\Facades\DB;
use Maatwebsite\Excel\Facades\Excel;

use App\Repositories\HolidayRepositoryInterface;

class HolidayController extends Controller
{
    public $obj;

    public function __construct(HolidayRepositoryInterface $obj)
    {
        $this->obj = $obj;
    }

    public function index()
    {
        $title = 'Holiday';

        return view($this->obj->layout().'.index', compact('title'));
    }

    public function getData(Request $request)
    {
        if ($request->ajax()) {
            $data = $this->obj->getList();
            return Datatables::of($data)
                ->addIndexColumn()
                ->addColumn('view', function($row){
                    return '<a href="'.route('holiday.show', $row->id).'" class="btn btn-outline-info btn-sm">View</a> '
                        + '<a href="'.route('holiday.edit', $row->id).'" class="btn btn-outline-warning btn-sm">Edit</a> &nbsp;'
                        + '<button type="button" onclick="hapus('.$row->id.')" id="hapus'.$row->id.'" class="btn btn-outline-danger btn-sm" data-href="'.route('holiday.destroy', $row->id).'" data-note="'.$row->holiday_date.'"><span class="fa fa-trash"></span> Delete</button>';
                })
                ->rawColumns(['view'])
                ->make(true);
        }
    }
}

Dari kode di atas yang berwarna hijau, itu adalah cara penggunaan class repository untuk digunakan dan dipanggil di class controller.

Masih dari kode di atas, method getData melakukan pengambilan data dari database melalui repository dengan memanggil method getList() dari class HolidayRepository.php yang akan kita buat setelah ini.

A.3 Repository Halaman Utama

Sebelum membuat class repository, tambahkan bind di file “app/Providers/RepositoryServiceProvider.php”

$this->app->bind(
   'App\Repositories\HolidayRepositoryInterface',
   'App\Repositories\HolidayRepository'
);

Buat file HolidayRepositoryInterface.php dan HolidayRepository.php di dalam folder “app/Repositories/”.

HolidayRepositoryInterface.php :

<?php
namespace App\Repositories;

interface HolidayRepositoryInterface
{
    public function layout();
    public function getList();
}

HolidayRepository.php :

<?php
namespace App\Repositories;

use App\Helpers\Datatable;
use Route;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;

use App\Models\Holiday;

class HolidayRepository implements HolidayRepositoryInterface
{
    public function layout()
    {
        return 'holiday';
    }
    
    public function getList()
    {     
        $data = Holiday::select('id',  'note', 
                     DB::Raw("DATE_FORMAT(holiday.holiday_date, '%d-%m-%Y') as holiday_date"))
                ->orderBy('id')
                ->get();

        return $data;
    }
}

Pada method getList(), pengambilan data dari database, menggunakan Eloquent ORM dimana kita membuat file model Holiday.php yang merepresentasikan table holiday di database.

A.4 Model Class

Buat file Holiday.php di folder “app/Models”.

<?php

namespace App\Models;

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

class Holiday extends Model
{
    use HasFactory;

    protected $table = 'holiday';
    public $timestamps = false;
    
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'id',
        'holiday_date',
        'note'
    ];
}

Pada class model ini, karena table holiday pada database tidak memiliki kolom default CRUD laravel (created_at, updated_at, deleted_at), maka ditambahkan public $timestamps = false;.

A.5 View Halaman Utama

Terakhir adalah menambahkan file blade di views folder untuk menampilkan data dan tampilan halaman utama. Buat file index.php di folder “resources/views/holiday/index.blade.php”. Folder holiday adalah folder yang kita tambahkan manual, jadi semua view yang berhubungan dengan menu ini akan disimpan di folder tersebut. Berikut isi dari file index.blade.php :

<div class="page-heading">
    <div class="page-title">
    <div class="row">
        <div class="col-12 col-md-6 order-md-1 order-last">
        <h3>{{ $title }}</h3>
        <p class="text-subtitle text-muted">{{ (isset($subtitle)) ? $subtitle : '' }}</p>
        </div>
        <div class="col-12 col-md-6 order-md-2 order-first">
        
        </div>
    </div>
    </div>
    <section class="section">
    <div class="card">
        <div class="card-header">
        <h4 class="card-title">List Holiday </h4>
        </div>
        <div class="card-body">

            <div class='col-md-12 mb-2'>
                <a href="{{ url('holiday/create') }}" class='btn btn-success btn-sm pull-right  mr-1'><i class='fa fa-plus'></i> Add Holiday</a>
            </div>
            <br />

            @if(Session::has('success'))
                <div class="alert alert-info text-center col-md-12">
                    {{ Session::get('success') }}
                    @php
                        Session::forget('success');
                    @endphp
                </div>
            @endif

            <div class="table-responsive">
                <table id="table-holiday" class="table table-striped table-hover table-bordered yajra-datatable" style="width:100%">
                    <thead>
                        <tr class='text-center'>
                            <th>No.</th>
                            <th>Holiday Date</th>
                            <th>Note</th>
                            <th>Action</th>
                        </tr>
                    </thead>
                    <tbody>
                    </tbody>
                </table>
            </div>
    
        </div>
    </div>
    </section>
</div>

<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.11.3/css/jquery.dataTables.min.css">
<script src="https://code.jquery.com/jquery-3.7.0.js"></script>
<script src="https://cdn.datatables.net/1.11.3/js/jquery.dataTables.min.js"></script>

<script type="text/javascript">

    var table;

$(function () {
    
    table = $('.yajra-datatable').DataTable({
        processing: true,
        serverSide: true,
        responsive: true,
        ajax: "{{ route('holiday.getdata') }}",
        columns: [
            {data: 'DT_RowIndex', name: 'DT_RowIndex', className: 'text-center'},           
            {data: 'holiday_date', name: 'holiday_date'},
            {data: 'note', name: 'note'},
            {
                data: 'view', 
                name: 'view', 
                orderable: false, 
                searchable: false,
                className: 'text-center'
            },
        ],
        "columnDefs": 
        [
            {
                'targets': [ 1, 2, 3],
                'className': 'mdl-data-table__cell--non-numeric',
            },
            {
                "searchable": true,
                "orderable":true,
                "targets": [1,2],
            },
            {
                "searchable": false,
                "orderable":false,
                "targets": [0,3],
            },
            {
                "width": "5%",
                "targets": 0
            },
            {
                "width": "12%",
                "targets": 1
            },
            {
                "width": "30%",
                "targets": 2
            },
            {
                "width": "20%",
                "targets": 3
            },          
        ]
    });

    $(document).on('focus', '#table-holiday_filter input', function() {
        $(this).unbind().bind('keyup', function(e) {
            if(e.keyCode === 13) {
                table.search( this.value ).draw();
            }
        });
    });

    $('.search-input-text').on( 'change', function () {   // for text boxes
        var i =$(this).attr('data-column');  // getting column index
        var v =$(this).val();  // getting search input value           
        table.columns(i).search(v).draw();
    });

});
</script>

A.6 Routes

Agar halaman holiday dapat tampil, maka perlu dibuat routes terlebih dahulu di file “routes/web.php”

Route::resource('holiday', 'HolidayController');
Route::get('holiday/getdata', 'HolidayController@getData')->name('holiday.getdata');

Setelah semua tahapan di atas selesai, silahkan buka browser dengan url aplikasi yang dibuat, ditambahkan nama route menu holiday (ex : http://demo2.local/holiday), maka akan muncul tampilan seperti ini.

Pada artikel ini kita telah membuat halaman utama yang menampilkan list data holiday. Berikutnya cara membuat halaman input data baru holiday dapat dilihat di artikel berikut :

https://javaziez.com/crud-laravel-8-dengan-repository-pattern-dan-yajra-datatables-step-2

Hi, I’m Javaziez

Leave a Reply

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