Tutorial Laravel Livewire 3 : #6 Edit dan Update Data ke Database


Tutorial Laravel Livewire 3 : #6 Edit dan Update Data ke Database

Halo teman-teman semuanya, pada artikel sebelumnya kita semua telah belajar bagaimana cara membuat proses insert data ke dalam database menggunakan Livewire dan pada kesempatan kali ini kita semua akan belajar bagaimana cara membuat proses edit dan update data di Laravel menggunakan Livewire.

Langkah 1 - Membuat Component Posts Edit

Silahkan teman-teman jalankan perintah berikut ini di dalam terminal/CMD dan pastikan sudah berada di dalam project Laravel-nya.

php artisan make:livewire posts.edit

Jika perintah di atas berhasil dijalankan, maka kita akan mendapatkan file component baru di dalam folder app/Livewire/Posts/Edit.php.

Silahkan teman-teman buka file tersebut dan ubah kode-nya menjadi seperti berikut ini.

<?php

namespace App\Livewire\Posts;

use App\Models\Post;
use Livewire\Component;
use Livewire\WithFileUploads;
use Livewire\Attributes\Rule;

class Edit extends Component
{
    use WithFileUploads;

    //id post
    public $postID;

    //image
    public $image;

    #[Rule('required', message: 'Masukkan Judul Post')]
    public $title;

    #[Rule('required', message: 'Masukkan Isi Post')]
    #[Rule('min:3', message: 'Isi Post Minimal 3 Karakter')]
    public $content;

    public function mount($id)
    {
        //get post
        $post = Post::find($id);

        //assign
        $this->postID   = $post->id;
        $this->title    = $post->title;
        $this->content  = $post->content;
    }

    /**
     * update
     *
     * @return void
     */
    public function update()
    {
        $this->validate();

        //get post
        $post = Post::find($this->postID);

        //check if image
        if ($this->image) {

            //store image in storage/app/public/posts
            $this->image->storeAs('public/posts', $this->image->hashName());

            //update post
            $post->update([
                'image' => $this->image->hashName(),
                'title' => $this->title,
                'content' => $this->content,
            ]);
        } else {

            //update post
            $post->update([
                'title' => $this->title,
                'content' => $this->content,
            ]);
        }

        //flash message
        session()->flash('message', 'Data Berhasil Diupdate.');

        //redirect
        return redirect()->route('posts.index');
    }

    /**
     * render
     *
     * @return void
     */
    public function render()
    {
        return view('livewire.posts.edit');
    }
}

Dari perubahan kode di atas, pertama kita import Model Posts.

use App\Models\Post;

Kemudian kita import WithFileUploads dari Livewire, karena akan kita gunakan untuk meng-upload sebuah gambar nantinya.

use Livewire\WithFileUploads;
use WithFileUploads;

Dan kita import Rule dari Livewire, ini akan kita gunakan untuk membuat validasi.

use Livewire\Attributes\Rule;

Setelah itu, kita buat 5 public properti, yaitu postID, image, title dan content. Dan masing-masing dari properti tersebut ada sebagian yang kita berikan validasi.

//id post
public $postID;

//image
public $image;

#[Rule('required', message: 'Masukkan Judul Post')]
public $title;

#[Rule('required', message: 'Masukkan Isi Post')]
#[Rule('min:3', message: 'Isi Post Minimal 3 Karakter')]
public $content;

Selanjutnya, kita buat method baru dengan nama mount. Method ini merupakan method yang akan dipanggil pertama kali saat component dijalankan.

public function mount($id)
{

	//...
	
}

Pada method di atas, akan kita manfaatkan untuk mengambil data post berdasarkan ID.

//get post
$post = Post::find($id);

Setelah data post sudah berhasil didapatkan, kemudian kita assign atau masukkan ke dalam properti di atas.

//assign
$this->postID   = $post->id;
$this->title    = $post->title;
$this->content  = $post->content;

Kemudian kita buat method lagi dengan nama update. Method ini akan dijalankan saat form disubmit.

public function update()
{

	//...
	
}

Di dalamnya kita panggil validasi, agar Rule yang sudah kita buat sebelumnya bisa digunakan.

$this->validate();

Setelah itu, kita lakukan get detail data post berdasarkan ID.

//get post
$post = Post::find($this->postID);

Dan selanjutnya kita buat sebuah kondisi untuk pengecekan image.

//check if image
if ($this->image) {

	//...
	
} else {
	
	//...

}

Jika image memiliki value, maka kita upload gambar baru dan update data ke dalam database.

//store image in storage/app/public/posts
$this->image->storeAs('public/posts', $this->image->hashName());

//update post
$post->update([
    'image' => $this->image->hashName(),
    'title' => $this->title,
    'content' => $this->content,
]);

Jika image kosong, maka kita cukup update data title dan content saja.

//update post
$post->update([
    'title' => $this->title,
    'content' => $this->content,
]);

Dan kita buat session flash untuk menampilkan pesan update data sukses dan sekaligus kita redirect ke route yang bernama posts.index.

//flash message
session()->flash('message', 'Data Berhasil Diupdate.');

//redirect
return redirect()->route('posts.index');

Langkah 2 - Membuat Form Edit Data

Setelah berhasil membuat component dan memberikan beberapa method di dalamnya, maka kita akan lanjutkan membuat view untuk menampilkan form edit data.

Silahkan teman-teman buka file resources/views/livewire/posts/edit.blade.php dan ubah semua kode-nya menjadi seperti berikut ini.

@section('title')
Edit Post - Belajar Livewire 3 di SantriKoding.com
@endsection

<div class="container mt-5 mb-5">
    <div class="row">
        <div class="col-md-12">
            <div class="card border-0 shadow-sm rounded">
                <div class="card-body">
                    <form wire:submit="update" enctype="multipart/form-data">

                        <div class="form-group mb-4">

                            <label class="fw-bold">GAMBAR</label>
                            <input type="file" class="form-control @error('image') is-invalid @enderror" wire:model="image">

                            <!-- error message untuk title -->
                            @error('image')
                            <div class="alert alert-danger mt-2">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>

                        <div class="form-group mb-4">
                            <label class="fw-bold">JUDUL</label>
                            <input type="text" class="form-control @error('title') is-invalid @enderror" wire:model="title" placeholder="Masukkan Judul Post">

                            <!-- error message untuk title -->
                            @error('title')
                            <div class="alert alert-danger mt-2">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>

                        <div class="form-group mb-4">
                            <label class="fw-bold">KONTEN</label>
                            <textarea class="form-control @error('content') is-invalid @enderror" wire:model="content" rows="5" placeholder="Masukkan Konten Post"></textarea>

                            <!-- error message untuk content -->
                            @error('content')
                            <div class="alert alert-danger mt-2">
                                {{ $message }}
                            </div>
                            @enderror
                        </div>

                        <button type="submit" class="btn btn-md btn-primary">UPDATE</button>
                        <button type="reset" class="btn btn-md btn-warning">RESET</button>

                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

Di atas, bisa teman-teman perhatikan pada bagian action form, kita arahkan ke dalam method yang bernama update dengan menggunakan direktif wire:submit.

<form wire:submit="update" enctype="multipart/form-data">

	//...
	
</form>

Langkah 3 - Membuat Route

Silahkan teman-teman buka file routes/web.php, kemudian ubah semua kode-nya menjadi seperti berikut ini.

<?php

use Illuminate\Support\Facades\Route;

//posts index
Route::get('/', App\Livewire\Posts\Index::class)->name('posts.index');

//posts create
Route::get('/create', App\Livewire\Posts\Create::class)->name('posts.create');

//posts edit
Route::get('/edit/{id}', App\Livewire\Posts\Edit::class)->name('posts.edit');

Di atas, kita menambahkan sebuah route baru dengan path /edit/{id} dan kita arahkan ke dalam class component post edit.

Langkah 4 - Uji Coba Edit dan Update Data Post

Silahkan teman-teman klik button EDIT di salah satu data yang dimiliki, jika berhasil maka akan menampilkan form edit seperti berikut ini.

Setelah itu, silahkan ubah isinya sesuai kebutuhan dan klik button UPDATE, jika berhasil maka akan menampilkan hasil seperti berikut ini.

Kesimpulan

Pada artikel ini kita semua telah belajar bagaimana cara membuat component Livewire untuk edit data dan belajar membuat form edit beserta route-nya.

Pada artikel selanjutnya kita semua akan belajar bagaimana cara membuat proses delete data dari database menggunakan Livewire.

Terima Kasih



Fika Ridaul Maulayya
Full-Stack Developer, Content Creator and CO-Founder SantriKoding.com

Suka dengan tulisan di SantriKoding? Kamu bisa memberikan dukungan dengan berdonasi atau bagikan konten ini di sosial media. Terima kasih atas dukungan Anda!

KEBIJAKAN KOMENTAR

Saat memberikan komenatar silahkan memberikan informasi lengkap tentang error, seperti: screenshot, link kode, dll. Baca aturan komentar kami