Tutorial Membuat Aplikasi CRUD Website Sewa Barang dengan Laravel 11

Hai Sobat BWA!🙌

Laravel 11 hadir dengan beberapa pembaruan dari versi sebelumnya. Tidak terdapat banyak perubahan yang begitu signifikan antara Laravel 10 dan Laravel 11. Agar dapat mengetahui secara langsung perubahan apa saja yang ada, pada artikel kali ini kita akan membuat sebuah project sewa barang menggunakan Laravel 11. Selain dapat digunakan untuk latihan, project ini juga dapat kalian kembangkan lagi dan digunakan sebagai portofolio loh.

Simak artikel berikut sampai habis ya!

Persiapan

2(5).jpg

Berikut ini merupakan tools yang harus dipersiapkan:

  1. Visual Studio Code: Pastikan kalian sudah meng-install VS Code dan jika belum, kalian dapat meng-install nya di sini
  2. Xampp: Jika belum tersedia xampp pada komputer kalian, kalian dapat melakukan instalasi xampp terlebih dahulu. Kalian dapat meng-install nya di sini
  3. Postman: Aplikasi ini diperlukan untuk melakukan testing API yang telah kita buat. Install postman di sini
  4. PHP: PHP yang diperlukan untuk Laravel 11 adalah PHP dengan versi ≥ 7.3.
  5. Composer: Sebuah dependency manager untuk bahasa pemrograman PHP. Untuk mengecek apakah pada laptop kalian sudah ter-install composer, jalankan perintah composer -v . Dan jika belum ter-install, kalian dapat meng-installnya di sini

Struktur Database

Kali ini, kita akan membuat website sewa barang dan struktur database seperti berikut:

tools (10).jpg

Perhatikan dengan benar struktur database di atas seperti primary key dan foreign key.

Langkah-Langkah

1. Buka command prompt dan masuk pada direktori mana kalian akan menyimpan project ini. Lalu, create project menggunakan Laravel dengan menjalankan perintah berikut dan tunggu hingga proses instalasi selesai

composer create-project laravel/laravel rent_items_projects

2. Buka phpmyadmin dan buatlah database baru dengan nama rent_items. Lalu, sesuaikan file .env dengan database yang telah kita buat

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=rent_items
DB_USERNAME=root
DB_PASSWORD=

3. Setelah database siap, selanjutnya kita akan membuat file migrasi, model, dan controller sekaligus. Jalankan perintah berikut satu-persatu ya!

php artisan make:model Users -mcr
php artisan make:model Items -mcr
php artisan make:model Categories -mcr
php artisan make:model Borrowing_item -mcr
php artisan make:model Returning_item -mcr

4. Setelah itu buka file migration yang terletak pada direktori database/migration. Sesuaikan kodenya dengan kode berikut

  • -File Migrasi User
public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->timestamps();
        });
    }

-File Migrasi Categories

public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->id();
            $table->string('category_name');
            $table->timestamps();
        });
    }

-File Migrasi Items

public function up()
    {
        Schema::create('items', function (Blueprint $table) {
            $table->id();
            $table->foreignId('category_id')->constrained('categories')->onDelete('cascade');
            $table->string('name');
            $table->text('description')->nullable();
            $table->string('image')->nullable();
            $table->integer('stock');
            $table->timestamps();
        });
    }
  • -File Migrasi Borrowing_item
public function up()
    {
        Schema::create('borrowing_item', function (Blueprint $table) {
            $table->id();
            $table->foreignId('user_id')->constrained('users')->onDelete('cascade');
            $table->foreignId('item_id')->constrained('items')->onDelete('cascade');
            $table->string('customer_name');
            $table->date('borrowing_date');
            $table->timestamps();
        });
    }

-File Migrasi Returning_item

public function up()
    {
        Schema::create('borrowing_item', function (Blueprint $table) {
            $table->id();
            $table->foreignId('borrowing_item_id')->constrained('borrowing_item')->onDelete('cascade');
            $table->date('return_date');
            $table->timestamps();
        });
    }

5. Setelah itu, jalankan php artisan migrate untuk melakukan migrasi database

6. Buka file Items model yang terletak pada direktori app/models dan sesuaikan kodenya seperti berikut:

class Items extends Model
{
    protected $fillable = [
        'category_id',
        'name',
        'description',
        'image',
        'stock',
    ];
}

Lakukan hal yang sama pada tabel lain dengan menyesuaikannya sesuai kolom pada masing-masing database

7. Selanjutnya kita akan mengedit file controller dengan menambahkan function CRUD (Create, Read, Update, Delete) pada masing-masing tabel

-UsersController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Users;

class UsersController extends Controller
{
    public function store(Request $request)
    {
        $request->validate([
            'name' => 'required',
            'email' => 'required|email|unique:users',
            'password' => 'required',
        ]);
        
        $user = new User();
        $user->name = $request->input('name');
        $user->email = $request->input('email');
        $user->password = bcrypt($request->input('password')); 
        $user->save();

        return response()->json(['message' => 'User created successfully', 'data' => $user], 201);
    }

    public function read()
    {
        $users = Users::all();

        return response()->json(['data' => $users], 200);
    }

    public function update(Request $request, $id)
    {
        $request->validate([
            'name' => 'required',
            'email' => 'required|email',
        ]);

        // Cari user berdasarkan ID
        $user = Users::findOrFail($id);

        // Update data user
        $user->name = $request->input('name');
        $user->email = $request->input('email');

        $user->save();

        return response()->json(['message' => 'User updated successfully', 'data' => $user], 200);
    }

    public function destroy($id)
    {
        // Cari user berdasarkan ID
        $user = Users::findOrFail($id);
        $user->delete();

        return response()->json(['message' => 'User deleted successfully'], 200);
    }
}

-CategoriesController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Categories;

class CategoriesController extends Controller
{
    public function create(Request $request)
    {
        $request->validate([
            'category_name' => 'required',
        ]);

        $categories = new Categories();
        $categories->category_name = $request->input('category_name');
        $categories->save();

        return response()->json(['message' => 'Category added successfully', 'data' => $categories], 201);
    }

    public function read()
    {
        $categories = Categories::all();

        return response()->json(['data' => $categories], 200);
    }

    public function update(Request $request, $id)
    {
        $request->validate([
            'category_name' => 'required',
        ]);

        $categories = Categories::findOrFail($id);

        // Update data categories
        $categories->category_name = $request->input('category_name');
 
        $user->save();

        return response()->json(['message' => 'Category updated successfully', 'data' => $user], 200);
    }

    public function delete($id)
    {
        // Cari category berdasarkan ID
        $categories = Categories::findOrFail($id);

        $categories->delete();

        return response()->json(['message' => 'Category deleted successfully'], 200);
    }
}

-ItemsController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Categories;
use App\Models\Items;
use Illuminate\Http\JsonResponse;

class ItemsController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        $validatedData = $request->validate([
            'category_id' => 'required|exists:categories,id',
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'image' => 'nullable|image|max:2048',
            'stock' => 'required|integer|min:0',
        ]);

        $item = new Items ($validatedData);

        if ($request->hasFile('image')) {
            $item->image = $request->file('image')->store('images');
        }

        $item->save();

        return response()->json(['success' => true, 'message' => 'Item created successfully.', 'item' => $item]);
    }

    public function read()
    {
        $item = Items::all();

        return response()->json(['data' => $item], 200);
    }

    public function update(Request $request, Item $item): JsonResponse
    {
        $validatedData = $request->validate([
            'category_id' => 'required|exists:categories,id',
            'name' => 'required|string|max:255',
            'description' => 'nullable|string',
            'image' => 'nullable|image|max:2048',
            'stock' => 'required|integer|min:0',
        ]);

        $item->fill($validatedData);

        if ($request->hasFile('image')) {
            $item->image = $request->file('image')->store('images');
        }

        $item->save();

        return response()->json(['success' => true, 'message' => 'Item updated successfully.', 'item' => $item]);
    }

    public function delete($id)
    {
        $item = Items::findOrFail($id);

        $item->delete();

        return response()->json(['message' => 'Item deleted successfully'], 200);
    }
}

-BorrowingItemController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Borrowing_item;
use App\Models\Items;
use App\Models\Users;
use Illuminate\Http\JsonResponse;

class BorrowingItemController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        $validatedData = $request->validate([
            'user_id' => 'required|exists:users,id',
            'item_id' => 'required|exists:items,id',
            'customer_name' => 'required|string|max:255',
            'borrowing_date' => 'required|date',
        ]);

        $borrowingItem = new BorrowingItem($validatedData);
        $borrowingItem->save();

        return response()->json(['success' => true, 'message' => 'Borrowing item created successfully.', 'borrowingItem' => $borrowingItem]);
    }

    public function show(BorrowingItem $borrowingItem): JsonResponse
    {
        return response()->json($borrowingItem);
    }

    public function update(Request $request, BorrowingItem $borrowingItem): JsonResponse
    {
        $validatedData = $request->validate([
            'user_id' => 'required|exists:users,id',
            'item_id' => 'required|exists:items,id',
            'customer_name' => 'required|string|max:255',
            'borrowing_date' => 'required|date',
        ]);

        $borrowingItem->fill($validatedData);
        $borrowingItem->save();

        return response()->json(['success' => true, 'message' => 'Borrowing item updated successfully.', 'borrowingItem' => $borrowingItem]);
    }

    public function destroy(BorrowingItem $borrowingItem): JsonResponse
    {
        $borrowingItem->delete();
        return response()->json(['success' => true, 'message' => 'Borrowing item deleted successfully.']);
    }
}

-ReturningItemController

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Returning_item;
use App\Models\Borrowing_item;
use Illuminate\Http\JsonResponse;

class ReturningItemController extends Controller
{
    public function store(Request $request): JsonResponse
    {
        $validatedData = $request->validate([
            'returning_item_id' => 'required|exists:borrowing_item,id',
            'return_date' => 'required|date',
        ]);

        $returningItem = new ReturningItem([
            'returning_item_id' => $validatedData['returning_item_id'],
            'return_date' => $validatedData['return_date'],
        ]);

        $returningItem->save();

        return response()->json(['success' => true, 'message' => 'Returning item created successfully.', 'returning_item' => $returningItem]);
    }
    
    public function show(ReturningItem $returningItem): JsonResponse
    {
        return response()->json($returningItem);
    }

    public function update(Request $request, ReturningItem $returningItem): JsonResponse
    {
        $validatedData = $request->validate([
            'return_date' => 'required|date',
        ]);

        $returningItem->return_date = $validatedData['return_date'];
        $returningItem->save();

        return response()->json(['success' => true, 'message' => 'Returning item updated successfully.', 'returning_item' => $returningItem]);
    }

    public function destroy(ReturningItem $returningItem): JsonResponse
    {
        $returningItem->delete();
        return response()->json(['success' => true, 'message' => 'Returning item deleted successfully.']);
    }
}

8. Buat file routing. Karena pada Laravel 11 tidak menyediakan route api secara langsung, kita harus membuatnya secara manual. Jalankan perintah php artisan install:api untuk membuat file route api.

Jangan lupa untuk import controller pada file api terlebih dahulu ya! Contohnya seperti berikut:

use App\Http\Controllers\UserController;
use App\Http\Controllers\ItemsController;
use App\Http\Controllers\CategoriesController;
use App\Http\Controllers\BorrowingItemController;
use App\Http\Controllers\ReturningItemController;

Lalu, tambahkan kode berikut:

Route::apiResource('/user', UserController::class);
Route::apiResource('/item', ItemsController::class);
Route::apiResource('/categories', CategoriesController::class);
Route::apiResource('/item', BorrowingItemController::class);
Route::apiResource('/categories', ReturningItemController::class);

9. Setelah selesai, kita dapat melakukan testing API yang telah dibuat. Jalankan php artisan serve dan buka aplikasi postman. Berikut ini adalah cara melakukan testing API pada tabel user

  • -Create User

-Show User

-Delete User

Kesimpulan

Hasil dari aplikasi website sewa barang ini dapat dikembangkan lagi sesuai dengan yang kalian diinginkan. Jangan lupa untuk selalu mengikuti langkah-langkah tutorial dengan runtut agar tidak terdapat kesalahan saat membuat project. Selain itu, perlu juga untuk teliti saat melakukan coding agar tidak terjadi eror. Perlu juga untuk mempersiapkan tools yang akan dibutuhkan seperti VS Code, Xampp, Postman, PHP, dan Composer agar pembuatan project berjalan dengan lancar.

Semoga artikel ini dapat bermanfaat ya! Dan bagi kalian yang tertarik untuk mempelajari lebih lanjut tentang Laravel, kalian bisa mempelajarinya secara gratis melalui BuildWithAngga loh! Selain itu, terdapat banyak kelas lain seperti membangun website rental mobil, booking travel, dan lain-lain yang nantinya dapat kalian jadikan sebagai portofolio. Jangan lupa kepoin kelas-kelasnya ya! Sampai jumpa di artikel selanjutnya🙌