Update database

Update database

  • Những bài học trước chúng ta đã biết cách thêm và xem dữ liệu như thế nào, vậy còn cập nhật, thay đổi dữ liệu thì sao? Bài học này sẽ giúp các bạn hiểu rõ cách hoạt động cũng như cách có thể cập nhật dữ liệu một cách đơn giản dễ hiểu.
  • Nội dung bài học chỉ muốn giúp các bạn hiểu rõ hơn cách cập nhật dữ liệu database, không đề cập đến xử lý dữ liệu nhập, nếu cần thì các bạn xem thêm ở phần validate form nhe.
  • Kết quả bài trước ta có trang hiển thị bảng dữ liệu sau http://localhost:82/admin/news:
Laravel update database

Chuẩn bị

  • Muốn cập nhật dữ liệu nào, thì ít ra chúng ta cần xem được chi tiết dữ liệu đó, do đó ta cần một liên kết để xem dữ liệu cần cập nhật, và ta cũng cần một trang chi tiết có thể thay đổi dữ liệu, do vậy ta cần:

    • Link liên kết tới trang cập nhật dữ liệu.
    • Trang hiển thị dữ liệu cần cập nhật: ta cần tạo View, Route, Controller tương ứng.
  • Viết thêm Controller điều khiển cập nhật dữ liệu.
  • Cuối cùng là tạo một Route điều hướng dữ liệu từ Controller sang trang cập nhật dữ liệu, và trả kết quả về trang hiển thị ban đầu.

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

myproject

Thêm liên kết cập nhật dữ liệu cho /resources/views/admin/news.blade.php

Liên kết cần chứa id để có thể xem nội dung chi tiết của một dữ liệu cụ thể.

<h1>{{ $pageName }}</h1>
<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> | Delete</td>
        </tr>
        @endforeach
    </tbody>
</table>
  • Reload lại trang http://localhost:82/admin/news ta sẽ nhận được kết quả sau:
Laravel update database

Thêm nội dung Route

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

Route::get('/admin/news/edit/{id}', 'Admin\AdminNewsController@edit');
  • /admin/news/edit/{id}: đường dẫn trang cập nhật có chứa id.
  • Admin\AdminNewsController: thư mục Admin chứa Controller AdminNewsController.
  • edit: Đây là function edit($id) trong Controller AdminNewsController.

Thêm nội dung Controller

Thêm nội dung cho function show($id) của Controller AdminNewsController để gọi trang xem chi tiết một dữ liệu cụ thể khi người dùng click vào liên kết Edit:

/**
     * 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'));
    }
  • $news = News::findOrFail($id);: chọn dữ liệu đúng với điều kiện id bằng với id nhận được khi người dùng click vào Edit.
  • $pageName = 'News - Update';: Khai báo tên trang thôi, không quan trọng lắm.
  • return view('/admin/news_update', compact('news', 'pageName'));: gom dữ liệu trả về trang news_update.

Viết một trang view cập nhật chi tiết: /admin/news_update

Khi click vào liên kết Edit, Route điều hướng tới Controller, đồng thời function edit($id) sẽ gọi dữ liệu và hiển thị nội dung trên trang cập nhật /admin/news_update này. Ta tạo trang view news_update.blade.php đặt bên trong folder view /resource/views/admin/ với nội dung sau:

<h1>{{ $pageName }}</h1>
<form method="post" action="/admin/news/update/{{ $news->id }}">
    @method('PATCH')
    @csrf
    <input type="hidden" name="id" value="{{ $news->id }}">
    <p>
        <label for="title">Title</label><br>
        <input type="text" name="title" value="{{ $news->title }}">
    </p>

    <p>
        <label for="email">Email</label><br>
        <input type="text" name="email" value="{{ $news->email }}">
    </p>

    <p>
        <label for="description">Description</label><br>
        <textarea cols="50" rows="5" name="description">{{ $news->description }}</textarea>
    </p>

    <p>
        <button type="submit">Submit</button>
    </p>
</form>
  • action="/admin/news/update/{{ $news->id }}": Khi nhấn submit, nội dung form sẽ được gửi tới /admin/news/update/{{ $news->id }}, Route sẽ điều hướng đường dẫn này tới Controller xử lý tiếp.
  • value="{{ $news->id }}": giá trị này được ẩn, không được thay đổi, vì khi submit, dữ liệu sẽ được dựa theo id này mà cập nhật cho đúng mục cần thay đổi.
  • Những giá trị khác như: title, email, description được gọi bên trong khu vực có thể thay đổi được.

Hiển thị trang xem chi tiết dữ liệu:

Mở trang http://localhost:82/admin/news lên trình duyệt, click vào link Edit bất kỳ ta sẽ xem được kết quả sau:

Laravel update database

Tiến hành thay đổi dữ liệu

Khi nhấn submit, nội dung form sẽ được gửi tới /admin/news/update/{{ $news->id }}, do đó ta cần viết một Route để điều hướng tới Controller, cũng cần viết thêm một Controller để xử lý cập nhật dữ liệu mới vào database, ta lần lược viết như sau.

Thêm nội dung Route

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

Route::get('/admin/news/edit/{id}', 'Admin\[email protected]');
Route::PATCH('/admin/news/update/{id}', 'Admin\AdminNewsController>@update');
  • /admin/news/update/{id}: đường dẫn khi form được submit có chứa id.
  • Admin\AdminNewsController: thư mục Admin chứa Controller AdminNewsController.
  • update: Đây là function update($id) trong Controller AdminNewsController, được dùng để xử lý dữ liệu nhập từ form.

Thêm nội dung Controller

Thêm nội dung cho function show($id) của Controller AdminNewsController để gọi trang xem chi tiết một dữ liệu nào đó khi người dùng click vào liên kết Edit:

/**
     * 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();
        return redirect()->action('Admin\[email protected]');
    }
  • $news = News::find($id);: chọn dữ liệu đúng với điều kiện id bằng với id nhận được từ form.
  • $news->save();: lưu dữ liệu.
  • return redirect()->action('Admin\[email protected]');: gọi lại Controller với function index(), với function này sẽ hiển thị danh sách dữ liệu ban đầu.

Mở trang http://localhost:82/admin/news lên trình duyệt, click vào liên kết Edit bất kỳ, sau đó thay đổi nội dung và nhấn submit, ta sẽ xem được kết quả sau:

Laravel update database

Tới đây ta đã hoàn thành việc cập nhật dữ liệu cho một dữ liệu bất kỳ, bài tiếp theo sẽ hướng dẫn bạn cách xóa một dữ liệu không mong muốn.