Delete database Laravel (Xóa dữ liệu trên database)

Bài học này sẽ giúp các bạn tạo view để tiến hành xóa một dữ liệu không mong muốn. Nói chung là xóa dữ liệu một cách trực quan luôn. Bài này có sử dụng các file và kết quả từ bài trước, nếu chưa có các bạn vui lòng quay lại bài Tạo view Insert database Laravel. Bài này có sử dụng các view, controller từ bài trước nên nếu chưa tạo các bạn back lại tạo theo hướng dẫn nha.

Xác định mục đích

Trong bài trước khi truy cập vào  http://localhost:8000/admin/news chúng ta view được bảng dữ liệu như sau

Mục tiêu của chúng ta bây giờ là nhấn vào nút Delete của ID nào thì sẽ xóa dữ liệu của ID đó đi

Công tác chuẩn bị

Việc chúng ta cần làm là nhận diện dữ liệu cần xóa thông qua id, sau đó tiến hành xử lý xóa dữ liệu, muốn vậy chúng ta cần 

  • Thêm liên kết sao cho click vào sẽ gửi id tới trang xử lý xóa dữ liệu.
  • Viết Controller điều khiển việc xóa dữ liệu.
  • Cuối cùng là tạo một Route điều hướng dữ liệu từ Controller sang view.

Các file xử lý sẽ thuộc cấu trúc sau:

Thêm liên kết xóa dữ liệu cho /resources/views/admin/news.blade.php

Trong bài trước chúng ta đã tạo sẵn được trang xem dữ liệu bây giờ chúng ta chỉ cần thêm liên kết để xóa dữ liệu vào trang là đã có trang xóa dữ liệu trực quan. 

Chúng ta cần truyền ID vào liên kết để nhận dạng dữ liệu cần xóa, liên kết này ta viết dạng form submit dữ liệu, action điều hướng tới Controller xử lý dữ liệu, phương thức được sử dụng là DELETE, ta viết như sau:

<h2 class="box-title">{{ $pageName }}</h2>
<table border="1">
    <thead>
        <tr>
            <th>ID</th>
            <th>Title</th>
            <th>Email</th>
            <th>Tools</th>
        </tr>
    </thead>
    <tbody>
        @foreach($news as $row)
        <tr>
            <td>{{$row->id}}</td>
            <td><a href="/admin/news/{{$row->id}}">{{$row->title}}</a></td>
            <td>{{$row->email}}</td>
            <td><a href="/admin/news/edit/{{$row->id}}">Edit</a><br>
                <form method="POST" action="/admin/news/delete/{{$row->id}}" onsubmit="return ConfirmDelete( this )">
                    @method('DELETE')
                    @csrf
                    <button type="submit">Delete</button>
                </form>
            </td>
        </tr>
        @endforeach
    </tbody>
</table>

Trong đó :

  • /admin/news/delete/{{$row->id}}: khi nhấn submit, dữ liệu sẽ được gửi tới /admin/news/delete với id tương ứng.
  • onsubmit="return ConfirmDelete( this )": khai báo javascript trả về hàm ConfirmDelete để xuất thông báo thành công hoặc lỗi.
  • @method('DELETE'): gọi form với phương thức delete.
  • @csrf: tạo một chuỗi CSRF ngẫu nhiên, thuộc tính cần được sử dụng thường cho form.

Chạy lại đường dẫn http://localhost:8000/admin/news trên trình duyệt, ta sẽ nhận được kết quả sau:

Thiết lập để xóa dữ liệu trong database Laravel

Thêm nội dung Controller

Bây giờ chúng ta cần thêm nội dung cho function destroy($id) của Controller AdminNewsController để xóa dữ liệu theo ID 

Lúc này AdminNewsController có dạng 

<?php

namespace App\Http\Controllers\Admin;
use App\News;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Redirect;
class AdminNewsController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $news = DB::table('news')->select('*');
        $news = $news->get();


        $pageName = 'Tên Trang - News';


        return view('/admin/news', compact('news', 'pageName'));
    }


    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('/admin/news_create');
    }


    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $news = new News;
        $news->title = $request->title; 
        $news->email = $request->email;
        $news->description = $request->description;
        $news->save();
        action([AdminNewsController::class, 'create']);
        return Redirect::action([AdminNewsController::class, 'create']);        
    }


    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        $news = News::where('id', '=', $id)->select('*')->first();
        $des = html_entity_decode($news->description);
        return view('/admin/news_detail', compact('news', 'des'));
    }


    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    
    public function edit($id)
    {
        $news = News::findOrFail($id);
        $pageName = 'News - Update';
        return view('/admin/news_update', compact('news', 'pageName'));
    }


    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $news = News::find($id);
        $news->title = $request->title;
        $news->email = $request->email;
        $news->description = $request->description;
        $news->save();       
        action([AdminNewsController::class, 'index']);
        return Redirect::action([AdminNewsController::class, 'index']);      
    }


    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        
        $news = News::find($id);
        $news->delete();
        action([AdminNewsController::class, 'index']);
        return Redirect::action([AdminNewsController::class, 'index']);
    }
}

Thêm nội dung Route

Ta thêm vào Route /routes/web.php nội dung sau:

Route::DELETE('/admin/news/delete/{id}', [AdminNewsController::class,'destroy']);

Thực hiện xóa dữ liệu

Chúng ta truy cập lại trang http://localhost:8000/admin/news sau đó nhấn thử Delete để xóa dữ liệu của ID bất kỳ. Ví dụ ở đây chúng tôi xóa ID 30

Kết quả thành công ID 30 đã không còn

Lời kết:

Xóa dữ liệu trong database Laravel thực tế không khó như việc chèn hay update dữ liệu. Đơn giản chúng ta chỉ cần lấy được ID cần xóa sau đó sử dụng controller để xóa là được. Có đoạn nào chưa hiểu các bạn hãy comment bên dưới nhé. Chúc các bạn học tốt!

Bình luận