🛠️ පාඩම් මාලාව 10: දත්ත මැකීම, දත්ත වෙනස් කිරීම සහ තනි දත්ත පිටුව (CRUD)

පෙර පාඩම් වලදී අපි දත්ත database එකට ඇතුළත් කිරීමට (Create) සහ සියලු දත්ත බැලීමට (Read) ඉගෙන ගත්තා. මෙම පාඩමේදී, අපි සම්පූර්ණ CRUD (Create, Read, Update, Delete) ක්‍රියාවලිය සම්පූර්ණ කරමු. එනම්, පවතින දත්ත වෙනස් කිරීමට (Update) සහ මැකීමට (Delete) ඉගෙන ගනිමු.

අද ඉලක්ක:

පියවර 1: එක් එක් නම සඳහා වෙනම පිටුවක් (Show View)

පළමුව, නම් ලැයිස්තුවේ ඇති නමක් මත click කළ විට, එම නමට අදාළව නව පිටුවක් විවෘත කරමු.

1. Route එක සෑදීම (routes/web.php):
URL එකේදී greeting එකේ ID එක ලබාගැනීමට `{greeting}` ලෙස route parameter එකක් යොදමු.

// routes/web.php
use App\Http\Controllers\GreetingController;

// ...පෙර routes...
Route::get('/greeting/{greeting}', [GreetingController::class, 'singleShow'])->name('greeting.show');

මෙහි {greeting} යනු wildcard එකකි. Laravel ස්වයංක්‍රීයව මෙම ID එකට අදාළ `Greeting` Model instance එක Controller method එකට ලබා දෙයි (Route Model Binding).

2. Controller Method එක සෑදීම (GreetingController.php):
Route එකෙන් ලැබෙන `Greeting` object එක view එකට යවමු.

// GreetingController.php

public function singleShow(Greeting $greeting)
{
    // Route Model Binding නිසා Laravel විසින් ID එකට අදාළ Greeting object එක $greeting විචල්‍යයට ලබාදේ.
    return view('greeting-show', ['greeting' => $greeting]);
}

3. නව View එක සෑදීම (resources/views/greeting-show.blade.php):
මේ සඳහා අලුත් blade file එකක් සාදා, Controller එකෙන් එවන දත්ත පෙන්වමු.

<!DOCTYPE html>
<html lang="si">
<head>
    <title>{{ $greeting->name }} ගේ විස්තර</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <div class="card">
            <div class="card-header">
                <h4>Greeting Details</h4>
            </div>
            <div class="card-body">
                <h5 class="card-title">නම: {{ $greeting->name }}</h5>
                <p class="card-text">මෙම නම ඇතුළත් කළේ: {{ $greeting->created_at->format('Y-m-d H:i') }}</p>
                <a href="/" class="btn btn-primary"><-- ආපසු මුල් පිටුවට</a>
            </div>
        </div>
    </div>
</body>
</html>

4. මුල් View එකේ Link එක යෙදීම (greeting.blade.php):
දැන්, අපේ නම් ලැයිස්තුවේ ඇති එක් එක් නම, අදාළ show පිටුවට link කරමු.

<!-- greeting.blade.php -->
@foreach ($greetings as $greeting)
    <a href="{{ route('greeting.show', $greeting->id) }}" class="list-group-item list-group-item-action">
        {{ $greeting->name }}
    </a>
@endforeach

පියවර 2: දත්ත මැකීම (Delete)

දැන් අපි එක් එක් නම поруч මැකීමට button එකක් එකතු කර, එය ක්‍රියාත්මක වන ආකාරය සකස් කරමු.

1. Route එක සෑදීම (routes/web.php):
දත්ත මැකීම සඳහා අපි HTTP DELETE method එක භාවිතා කරමු.

// routes/web.php
Route::delete('/greeting/{greeting}', [GreetingController::class, 'destroy'])->name('greeting.destroy');

2. Controller Method එක සෑදීම (GreetingController.php):
Route එකෙන් ලැබෙන `Greeting` object එකේ delete() method එක call කර, නැවත redirect කරමු.

// GreetingController.php

public function destroy(Greeting $greeting)
{
    $greeting->delete();
    return redirect('/')->with('success', 'නම සාර්ථකව ඉවත් කරන ලදී!');
}

3. View එකට Delete Button එක එකතු කිරීම (greeting.blade.php):
HTML form එකක් DELETE request එකක් напряму යවන්නේ නැති නිසා, අපි Blade @method('DELETE') directive එක භාවිතා කරමු. එක් එක් නම поруч මෙම form එක එකතු කරන්න.

<!-- greeting.blade.php -->
<ul class="list-group">
    @foreach ($greetings as $greeting)
        <li class="list-group-item d-flex justify-content-between align-items-center">
            {{ $greeting->name }}
            <form action="{{ route('greeting.destroy', $greeting->id) }}" method="POST">
                @csrf
                @method('DELETE')
                <button type="submit" class="btn btn-danger btn-sm">Delete</button>
            </form>
        </li>
    @endforeach
</ul>

පියවර 3: දත්ත වෙනස් කිරීම (Update)

අවසාන වශයෙන්, පවතින නමක් වෙනස් කිරීමට අවශ්‍ය පියවර සකස් කරමු. මෙය පියවර දෙකකින් සමන්විතයි: Edit form එක පෙන්වීම සහ එම form එකෙන් එන දත්ත Update කිරීම.

1. Edit සහ Update සඳහා Routes සෑදීම (routes/web.php):

// routes/web.php

// Edit form එක පෙන්වීමට Route (GET request)
Route::get('/greeting/{greeting}/edit', [GreetingController::class, 'edit'])->name('greeting.edit');

// Form එකෙන් එන දත්ත භාරගෙන update කිරීමට Route (PUT request)
Route::put('/greeting/{greeting}', [GreetingController::class, 'update'])->name('greeting.update');

2. Controller Methods සෑදීම (GreetingController.php):

// GreetingController.php

// Edit form එකට දත්ත යවා view එක return කිරීම
public function edit(Greeting $greeting)
{
    return view('greeting-edit', ['greeting' => $greeting]);
}

// දත්ත update කිරීම
public function update(Request $request, Greeting $greeting)
{
    // 1. Validation
    $request->validate([
        'name' => 'required|string|max:255',
    ]);

    // 2. Update a record
    $greeting->update([
        'name' => $request->name,
    ]);

    // 3. Redirect with success message
    return redirect('/')->with('success', 'නම සාර්ථකව යාවත්කාලීන විය!');
}

3. Edit View එක සෑදීම (resources/views/greeting-edit.blade.php):
මෙම view එකේදී, පවතින නම input field එකේ value එක ලෙස පෙන්වමු.

<!DOCTYPE html>
<html lang="si">
<head>
    <title>Edit Name</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
    <div class="container mt-5">
        <div class="card">
            <div class="card-header">
                <h4>නම වෙනස් කරන්න</h4>
            </div>
            <div class="card-body">
                <form action="{{ route('greeting.update', $greeting->id) }}" method="POST">
                    @csrf
                    @method('PUT') <!-- HTTP PUT method එක භාවිතා කිරීමට -->
                    
                    <div class="mb-3">
                        <label for="name" class="form-label">නව නම</label>
                        <input type="text" class="form-control" id="name" name="name" value="{{ $greeting->name }}" required>
                    </div>
                    
                    <button type="submit" class="btn btn-success">Update</button>
                    <a href="/" class="btn btn-secondary">Cancel</a>
                </form>
            </div>
        </div>
    </div>
</body>
</html>

4. මුල් View එකට Edit Button එක එකතු කිරීම (greeting.blade.php):

<!-- greeting.blade.php -->
<li class="list-group-item d-flex justify-content-between align-items-center">
    <a href="{{ route('greeting.show', $greeting->id) }}">{{ $greeting->name }}</a>
    <div>
        <a href="{{ route('greeting.edit', $greeting->id) }}" class="btn btn-warning btn-sm">Edit</a>
        <form action="{{ route('greeting.destroy', $greeting->id) }}" method="POST" class="d-inline">
            @csrf
            @method('DELETE')
            <button type="submit" class="btn btn-danger btn-sm">Delete</button>
        </form>
    </div>
</li>
🎉 සුබ පැතුම්!

ඔබ දැන් Laravel හි මූලික CRUD (Create, Read, Update, Delete) ක්‍රියාවලිය සම්පූර්ණ කර ඇත. php artisan serve ක්‍රියාත්මක කර ඔබගේ යෙදුමේ නව හැකියාවන් අත්හදා බලන්න!