Press ESC to close

Cara Menampilkan dan Mengambil Data (Read) di Laravel 11 – CRUD #3

Pendahuluan

Setelah berhasil membuat form dan menyimpan data di artikel sebelumnya, kini saatnya kita mempelajari cara menampilkan data yang telah tersimpan. Dalam tutorial ini, kita akan mengimplementasikan operasi Read dengan fitur pagination dan pencarian.

Langkah 1: Update ProductController

Tambahkan kode berikut di app/Http/Controllers/ProductController.php:

public function index(Request $request)
{
    $search = $request->query('search');

    $products = Product::query()
        ->when($search, function ($query) use ($search) {
            return $query->where('name', 'like', "%{$search}%")
                        ->orWhere('description', 'like', "%{$search}%");
        })
        ->latest()
        ->paginate(10);

    return view('products.index', compact('products', 'search'));
}

public function show(Product $product)
{
    return view('products.show', compact('product'));
}

Langkah 2: Membuat View untuk List Data

Buat file resources/views/products/index.blade.php:

@extends('layouts.app')

@section('content')
<div class="container mx-auto px-4 py-8">
    <div class="flex justify-between items-center mb-6">
        <h1 class="text-2xl font-bold">Daftar Produk</h1>
        <a href="{{ route('products.create') }}" 
           class="bg-green-500 hover:bg-green-700 text-white font-bold py-2 px-4 rounded">
            Tambah Produk
        </a>
    </div>

    <!-- Search Form -->
    <div class="mb-6">
        <form action="{{ route('products.index') }}" method="GET">
            <div class="flex gap-4">
                <input type="text" 
                       name="search" 
                       value="{{ $search ?? '' }}"
                       placeholder="Cari produk..."
                       class="shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline">
                <button type="submit"
                        class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
                    Cari
                </button>
            </div>
        </form>
    </div>

    <!-- Products Table -->
    <div class="bg-white shadow-md rounded my-6">
        <table class="min-w-full">
            <thead>
                <tr class="bg-gray-100">
                    <th class="px-6 py-3 border-b text-left">Nama</th>
                    <th class="px-6 py-3 border-b text-left">Harga</th>
                    <th class="px-6 py-3 border-b text-left">Stok</th>
                    <th class="px-6 py-3 border-b text-center">Aksi</th>
                </tr>
            </thead>
            <tbody>
                @forelse ($products as $product)
                <tr class="hover:bg-gray-50">
                    <td class="px-6 py-4 border-b">{{ $product->name }}</td>
                    <td class="px-6 py-4 border-b">Rp {{ number_format($product->price, 0, ',', '.') }}</td>
                    <td class="px-6 py-4 border-b">{{ $product->stock }}</td>
                    <td class="px-6 py-4 border-b text-center">
                        <a href="{{ route('products.show', $product) }}" 
                           class="text-blue-600 hover:text-blue-900 mr-3">
                            Detail
                        </a>
                        <a href="{{ route('products.edit', $product) }}" 
                           class="text-yellow-600 hover:text-yellow-900 mr-3">
                            Edit
                        </a>
                        <form action="{{ route('products.destroy', $product) }}" 
                              method="POST" 
                              class="inline">
                            @csrf
                            @method('DELETE')
                            <button type="submit" 
                                    class="text-red-600 hover:text-red-900"
                                    onclick="return confirm('Apakah Anda yakin ingin menghapus produk ini?')">
                                Hapus
                            </button>
                        </form>
                    </td>
                </tr>
                @empty
                <tr>
                    <td colspan="4" class="px-6 py-4 border-b text-center">
                        Tidak ada produk yang ditemukan.
                    </td>
                </tr>
                @endforelse
            </tbody>
        </table>
    </div>

    <!-- Pagination -->
    <div class="mt-6">
        {{ $products->links() }}
    </div>
</div>
@endsection

Langkah 3: Membuat View Detail Produk

Buat file resources/views/products/show.blade.php:

@extends('layouts.app')

@section('content')
<div class="container mx-auto px-4 py-8">
    <div class="max-w-2xl mx-auto">
        <div class="bg-white shadow-md rounded px-8 pt-6 pb-8 mb-4">
            <h1 class="text-2xl font-bold mb-6">Detail Produk</h1>

            <div class="mb-4">
                <label class="block text-gray-700 font-bold mb-2">
                    Nama Produk
                </label>
                <p class="text-gray-900">{{ $product->name }}</p>
            </div>

            <div class="mb-4">
                <label class="block text-gray-700 font-bold mb-2">
                    Deskripsi
                </label>
                <p class="text-gray-900">{{ $product->description }}</p>
            </div>

            <div class="mb-4">
                <label class="block text-gray-700 font-bold mb-2">
                    Harga
                </label>
                <p class="text-gray-900">Rp {{ number_format($product->price, 0, ',', '.') }}</p>
            </div>

            <div class="mb-6">
                <label class="block text-gray-700 font-bold mb-2">
                    Stok
                </label>
                <p class="text-gray-900">{{ $product->stock }}</p>
            </div>

            <div class="flex items-center justify-between">
                <a href="{{ route('products.edit', $product) }}" 
                   class="bg-yellow-500 hover:bg-yellow-700 text-white font-bold py-2 px-4 rounded focus:outline-none focus:shadow-outline">
                    Edit Produk
                </a>
                <a href="{{ route('products.index') }}" 
                   class="text-gray-600 hover:text-gray-800">
                    Kembali
                </a>
            </div>
        </div>
    </div>
</div>
@endsection

Langkah 4: Konfigurasi Pagination dengan Tailwind

  1. Publish vendor pagination views:
php artisan vendor:publish --tag=laravel-pagination
  1. Edit file app/Providers/AppServiceProvider.php:
use Illuminate\Pagination\Paginator;

public function boot()
{
    Paginator::useBootstrap(); // Ganti dengan Tailwind jika diperlukan
}

Best Practices dan Tips

1. Optimasi Query

  • Gunakan eager loading untuk relasi
  • Index kolom yang sering dicari
  • Batasi jumlah data yang ditampilkan
// Contoh eager loading jika ada relasi
$products = Product::with('category')
    ->latest()
    ->paginate(10);

2. Search dan Filter

  • Gunakan scope untuk query yang sering digunakan
  • Sanitasi input pencarian
  • Tambahkan index untuk kolom yang sering dicari
// Di Model Product
public function scopeSearch($query, $search)
{
    return $query->where('name', 'like', "%{$search}%")
                 ->orWhere('description', 'like', "%{$search}%");
}

3. Security

  • Validasi input search
  • Hindari SQL injection
  • Gunakan proper escaping

4. Performance

  • Cache hasil query yang sering diakses
  • Optimasi jumlah query
  • Gunakan proper indexing

Kesimpulan

Sekarang Anda telah berhasil mengimplementasikan operasi Read di Laravel 11 dengan fitur:

  • Menampilkan list data
  • Pagination
  • Pencarian
  • Detail produk

Leave a Reply

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