Blog Details

Tutorial Laravel - CURD Dengan Laravel

Pada kesempatan kali ini kita akan belajar membuat curd dengan menggunakan laravel. Kita akan mencoba membuat studi kasus untuk membuat table untuk menyimpan data Toko. Tutorial ini merupakan lanjutan dari tutoral laravel kami sebelumnya tentang membaut member area di laravel. Jadi sebelum rekan rekan semua mengikuti tutorial ini, silahkan ikuti tutorial kami sebelumnya.

1. Bikin Controller, Model , Migration

Pertama tama kita bikin sebuah Controller, Model , Migration Toko dengan perintah

php artisan make:model Toko -mcr

Dengan perintah ini akan otomatis membuat sebuah controller , model dan juga Migration. Artinya akan otomatis tergenerate file controller di app\Http\Controllers\TokoController.php , kemudian model di app\Models\Toko.php  , dan migration di database\migrations\*****_create_tokos_table.php.

Selanjutnya kita edit file migration nya untuk menentukan data apa yang akan kita tambahkan . Jadi silahkan edit di file database\migrations\*****_create_tokos_table.php

Di dalam database ini saya hanya menambahkan 2 field saja. Nama dan note. kode di dilam method up akan terlihat seperti code dibawah ini

public function up(): void
{
    Schema::create('tokos', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('note')->nullable();
        $table->timestamps();
    });
}

Setelah kita melengkapi field yang akan kita gunakan di file migration, saatnya kita generate file migration itu dengan perintah di php artisan dengan perintah di bawah ini

php artisan migrate

Maka nanti di dalam database kita akan bertambah satu table yaitu table tokos.

2. Menbambahkan Route untuk memanage toko

Untuk menambahkan route / url untuk toko, maka kita akan menambahkan code di dalam file routes\web.php. Karena ketika kita mengakses halaman ini perlu login terlebih dahulu, maka ini harus kita tambahkan di dalam midleware.

Route::resource('/backend/toko',\App\Http\Controllers\TokoController::class);

Untuk kode lengkap di dalam midleware adalah seperti gambar di bawah ini

Route::group(['middleware' => 'auth'], function(){
    Route::get('/backend', [App\Http\Controllers\BackendController::class, 'index'])->name('home');
    Route::resource('/backend/toko',\App\Http\Controllers\TokoController::class);
});

Dengan kode diatas, kita sudah berhasil menambahkan route atau url untuk alamat /backend/toko. Selanjutnya kita akan menangkap url ini di dalam controller dan juga di template nya.

3. Bekerja pada Controller dan Template Blade

Untuk controller ini letaknya ada pada app\Http\Controllers\TokoController.php. Sehingga kita akan split pada beberapa method. Yaitu untuk menambah data, edit data dan juga menampilkan data.

Form Untuk Menambah Data

Untuk menambah data kita akan bekerja terlebih dahulu pada method create. Silahkan tambahkan code dibawah ini untuk menrahkan method create pada template.

return view('backend.toko.create');

Kode diatas mengarahkan create pada file resources\views\backend\toko\create.blade.php . Sehingga silahkan bikin folder toko dan file create.blade.php.

@extends('backend.layouts')
@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                        <div class="row">
                            <div class="col-md-10"> Add Toko/Supplier</div>
                            <div class="col-md-2"> 
                                <a class="btn icon icon-left btn-secondary" style="float:right" href="{{route('toko.index')}}" ><< Back</a>
                            </div>
                    </div>
                </div>

                <div class="card-body">
                    <div class="row">
                        <form method="POST" action="{{route('toko.store')}}">                          
                            @csrf                     
                            <div class="mb-3 col-md-12">
                                <label for="name" class="form-label">Name</label>                  
                                <input  class="form-control" type="text" id="name" name="name" value="{{ old('name') }}" autofocus="" required>                        
                                <div class="invalid-tooltip">Name</div>
                                @error('name')
                                <span class="text-danger" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                            </div>
                            <div class="mb-3 col-md-12">
                                <label for="note" class="form-label">Note</label>                  
                                <input  class="form-control" type="text" id="note" name="note" value="{{ old('note') }}" autofocus="">                        
                                <div class="invalid-tooltip">Note</div>
                                @error('note')
                                <span class="text-danger" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                            </div>

                            <div class="mt-2">
                                <button type="submit" class="form-control button-create me-2">Add</button>
                            </div>
                        </form>                  
                    </div>        
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Process Menambah Data

Kode diatas, ketika kita akan menambah data, maka form mengarahkan pada route {{route('toko.store')}}". Jadi kali ini kita akan bekarja pada methos store. Pertama kita harus bikin validasi agar supa nama toko tidak boleh sama. Kode di methos store untuk validasi adalah

$validator = Validator::make($request->all(),[
    "name" => "required|unique:tokos,name"
]);        
if($validator->fails()){            
    return redirect()->back()->withInput($request->all())->withErrors($validator);
}

Kita butuh class validator. sehingga kita perlu mengimport validator di bagian atas dari class ini.

use Illuminate\Support\Facades\Validator;

Jika validator fail, maka controller akan kembali ke from sebelumnya dengan memberikan keterangan errornya.

Jika tidak error dalam validasi, maka langkah selanjutnya adalah menbambahkan data ke dalam database. Untuk kode didalam method store secara penuh adalah sebagai berikut. 

    public function store(Request $request)
    {
        $validator = Validator::make($request->all(),[
            "name" => "required|unique:tokos,name"
        ]);        
        if($validator->fails()){     

            return redirect()->back()->withInput($request->all())->withErrors($validator);
        }
        DB::beginTransaction();
        try {

           $toko=Toko::create([
            'name' => $request->name,
            'note' => $request->note,
           ]);      

           if($toko){
            return redirect()->route('toko.index');
           }
          
        } catch (\Throwable $th) {
  
            DB::rollBack();
            return redirect()->back()->withInput($request->all())->withErrors($validator);
        }finally{
            DB::commit();          
        }
    }

Karena adanya penambahan Class DB, maka kita harus menambahkan / mengimport DB kedalam class

use Illuminate\Support\Facades\DB;

Dan untuk proses penambahan data, agar kita bisa mengisi data di dalam table, maka perlu kita lakukan configurasi di dalam file modelnya. Pada file app\Models\Toko.php. anda bisa menambahkan kode

protected $guarded= [];

 

Menampilkan Data

Untuk menampilkan data kita akan bekerja pada method index dan template index. untuk itu silahkan bikin file index.blade.php di dalam folder resources\views\backend\toko\index.blade.php

Didalm controllernya kita taruh kode dibawah ini

public function index()
{
     return view('backend.toko.index',['tokos'=> Toko::latest()->paginate(10)]);
}

Kemudian untuk file index.blade.php bisa di berikan kode berikut.

Karena didalam file index ini nanti kita akan tambahkan javascript , maka kita perlu manabahkan 

@stack('javascript-external')
@stack('javascript-internal')

Kode ini kita letaakkan pada file layout nya. yatu di file resources\views\backend\layouts.blade.php. Dan ini kita letakkan di bagian bawah diatas </body>

.......................
    @stack('javascript-external')
    @stack('javascript-internal')
</body>
</html>

Dan untuk kode di method indexnya, bisa kita isi dengan code dibawah ini

@extends('backend.layouts')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                    <div class="row">
                        <div class="col-md-10"> All Toko</div>
                        <div class="col-md-2"> 
                            <a class="btn icon icon-left btn-primary" style="float:right" href="{{route('toko.create')}}" >Add Toko</a>
                        </div>
                   </div>
                </div>

                <div class="card-header">
                    <div class="row mt-2">
                        <div class="col-md-8"> 
                            <div class="d-flex">{{$tokos->links("pagination::bootstrap-4")}}</div>
                        </div>
                    </div>    
                </div>

                <div class="card-body">                   
                    <div class="table-responsive">                      
                        <table class="table table-lg">
                            <thead>
                                <tr>
                                    <th>ID</th>
                                    <th>Name</th>
                                    <th width=10%>Action</th>
                                </tr>
                            </thead>
                            <tbody>
                                @forelse ( $tokos as $toko )
                                    <tr>
                                        <td class="text-bold-500">#{{$toko->id}}</td>
                                        <td>{{$toko->name}}</td>
                                        <td>
                                            <a class="btn icon icon-left btn-primary" href="{{route('toko.edit',['toko'=>$toko])}}" >Edit</a>
                                            <button onclick="deleteItem('{{ $toko->id }}','{{ $toko->name }}');" class="btn icon icon-left btn-danger" data-bs-toggle="modal" data-bs-target="#deleteModal">Del</button>
                                        </td>
                                    </tr>
                                @empty                
                                @endforelse
                                    
                            </tbody>
                        </table>                
                    </div>
                </div>
            </div>
            <div class="modal fade text-left" id="deleteModal" tabindex="-1" role="dialog"
            aria-labelledby="myModalLabel120" aria-hidden="true">
            <div class="modal-dialog modal-dialog-centered modal-dialog-scrollable"
                role="document">
                <div class="modal-content">
                    <form id="form_delete" action="" method="post">
                        @method('DELETE')
                        @csrf
                        <div class="modal-header bg-danger">
                            <h5 class="modal-title white" id="myModalLabel120">Warning
                            </h5>
                        </div>
                        <div class="modal-body">
                        Do You Want To Delete Toko <span id="delete_label"></span> ?
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-light-secondary"
                                data-bs-dismiss="modal">
                                <i class="bx bx-x d-block d-sm-none"></i>
                                <span class="d-none d-sm-block">Cancel</span>
                            </button>
                            <button type="submit" class="btn btn-danger ml-1">
                                <span class="d-none d-sm-block">Delete</span>
                            </button>
                        </div>
                    </form>
                </div>
            </div>
            
            
        </div>
    </div>
</div>
@endsection

@push('javascript-internal')
<script>
     function deleteItem(id,name){    
        var url = '{{ route("toko.destroy",["toko" => ":toko_id" ])}}';
        url = url.replace(':toko_id', id);   
        document.getElementById("form_delete").action = url;
        document.getElementById('delete_label').innerHTML=name;
    }
    
</script>
@endpush

Menampilkan Data

Untuk delete data, kita sudah memberikan tombol pada index.blade.php , sehingga kita hanya perlu memberikan handle di method destroynya. Silahkan isikan code dibawah ini.

    public function destroy(Toko $toko)
    {

        DB::beginTransaction();
        try {          
            $toko->delete();     
            return redirect()->route("toko.index");  
        } catch (\Throwable $th) {
            DB::rollBack();
        }finally{
            DB::commit();          
            return redirect()->back();
        }
    }

Untuk process message, anda bisa membuat seperti tutorial sebelunya dengan mengirimkan session ke blade dengan kode

 @if (\Session::has('success'))
         <div class="alert alert-success">
                   {!! \Session::get('success') !!}
         </div>
@endif  

 

Edit Data

Untuk Edit data, kita bisa menggunakan method edit untuk mengarahkan ke dalam formnya.

   public function edit(Toko $toko)
   {
        return view('backend.toko.edit',['toko'=> $toko]);
   }

Untuk file bladenya kita tinggal copy dari create.blade.php, rubah menjadi edit.blade.php . Setelah itu kita  melakukan beberapa perubahan.

  1. Untuk bagian form rubah
    <form method="POST" action="{{route('toko.store')}}">                          
         @csrf  

    Rubah menjadi

    <form method="POST" action="{{route('toko.update',['toko'=> $toko])}}">    
         @method('PUT')      
         @csrf 
  2. Untuk value tiap tiap input dirubah
    value="{{ old('name') }}"
    Menjadi
    value="{{ old('name',$toko->name) }}"
    Begitu pula untuk notenya
    value="{{ old('note') }}"
    Menjadi
    value="{{ old('note',$toko->note) }}"

Dan untu full kodenya seperti dibawah ini

@extends('backend.layouts')
@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-12">
            <div class="card">
                <div class="card-header">
                        <div class="row">
                            <div class="col-md-10"> Edit Toko/Supplier</div>
                            <div class="col-md-2"> 
                                <a class="btn icon icon-left btn-secondary" style="float:right" href="{{route('toko.index')}}" ><< Back</a>
                            </div>
                    </div>
                </div>

                <div class="card-body">
                    <div class="row">
                    <form method="POST" action="{{route('toko.update',['toko'=> $toko])}}" enctype="multipart/form-data">    
                        @method('PUT')      
                        @csrf                    
                            <div class="mb-3 col-md-12">
                                <label for="name" class="form-label">Name</label>                  
                                <input  class="form-control" type="text" id="name" name="name" value="{{ old('name',$toko->name) }}" autofocus="" required>                        
                                <div class="invalid-tooltip">Name</div>
                                @error('name')
                                <span class="text-danger" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                            </div>
                            <div class="mb-3 col-md-12">
                                <label for="note" class="form-label">Note</label>                  
                                <input  class="form-control" type="text" id="note" name="note" value="{{ old('note',$toko->note) }}" autofocus="">                        
                                <div class="invalid-tooltip">Note</div>
                                @error('note')
                                <span class="text-danger" role="alert">
                                    <strong>{{ $message }}</strong>
                                </span>
                                @enderror
                            </div>

                            <div class="mt-2">
                                <button type="submit" class="form-control button-create me-2">Update</button>
                            </div>
                        </form>                  
                    </div>        
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Untuk proses penyimpanan berada di controllernya pada method update. Anda bisa mengisinya dengan kode dibawah ini.

    public function update(Request $request, Toko $toko)
    {
        $validator = Validator::make($request->all(),[
            "name" => "required|unique:tokos,name,".$toko->id,
        ]);     

        if($validator->fails()){            
            return redirect()->back()->withInput($request->all())->withErrors($validator);
        }

        DB::beginTransaction();
        try {  
            $toko->update([
                'name'  => $request->name, 
                'note'  => $request->note,   
            ]); 
            return redirect()->route('toko.index')->with('success', 'Anda berhasil update data');
        } catch (\Throwable $th) {  
            DB::rollBack();
            return redirect()->back()->withInput($request->all())->withErrors($validator);
        }finally{
            DB::commit();          
        }
    }

Ok demikianlah tutorial curd dengan laravel. semoga bermanfaat.