Bài 9. Sử dụng Eloquent trong Laravel 5

Bài trước mình đã giới thiệu về Model trong Laravel 5 và hướng dẫn các bạn tạo model website tin tức. Bài hôm nay chúng ta sẽ đi tìm hiểu về Eloquent và cách sử dụng Eloquent trong Laravel 5. Đồng thời ứng dụng Eloquent tạo trang quản lý loại tin cho dự án website tin tức

Mục Lục:

1. Giới thiệu Eloquent trong Laravel

Eloquent trong Laravel 5 chính là một ORM (Object-relational mapping), cung cấp các ActiveRecord đơn giản nhưng vô cùng chuyên nghiệp, giúp chúng ta làm việc với cơ sở dữ liệu thuận tiện hơn.

Với Eloquent trong Laravel 5 đã xây dựng sẵn các phương thức thêm, xóa, cập nhậttruy vấn, giúp cho việc sử dụng database trở nên dễ dàng hơn bao giờ hết.

2. Hướng dẫn sử dụng Eloquent trong Laravel

Để các bạn hiểu hơn về cách sử dụng Eloquent, mình sẽ đưa ra ví dụ sau:

Giả sử mình có bảng thanhvien có các trường sau: id, ten, tuoi, gioitinh

Tạo model ThanhVien. cái này mình đã hướng dẫn các bạn ở bài trước rồi nên mình không nói lại nữa. Bạn nào nắm rõ có thể xem lại bài 7

Thêm 1 record mới vào database

        $thanhvien = new App\ThanhVien();
        $thanhvien->name = 'TrungLe';
        $thanhvien->tuoi = 24;
        $thanhvien->gioitinh = 1; //nam
        $thanhvien->save();
    

Truy vấn dữ liệu trong database

        $thanhvien = App\ThanhVien::all(); // lấy tất cả dữ liệu
        $thanhvien = App\ThanhVien::find(1); // lấy theo id
        $thanhvien = App\ThanhVien::where('gioitinh', '=', 1); // lấy giới tính
    

Cập nhật thông tin record vừa tạo

        $thanhvien = App\ThanhVien::find(1); // tìm id của thành viên cần cập nhật
        $thanhvien->name = 'TrungLe';
        $thanhvien->tuoi = 24;
        $thanhvien->gioitinh = 1; //nam
        $thanhvien->update();
    

Xóa record trong database

        $thanhvien = App\ThanhVien::find(1); // tìm id của thành viên cần xóa
        $thanhvien->delete();
    

3. Ứng dụng Eloquent tạo trang quản lý loại tin

Chuẩn bị giao diện:

Cái này mình đã chuẩn bị sẵn cho các bạn, bạn nào đã từng làm việc với adminlte rồi có thể tự thiết kế lại theo ý của minh tùy thích. Download: tại đây

Sau khi download load về các bạn giải nén vào thư mục resources/views/admin

route cho trang quản trị loại tin

        Route::group(['prefix' => 'administrator'], function () {
            Route::get('index', 'AdminController@index');

            Route::group(['prefix' => 'category'], function () {
                // hiển thị danh sách loại tin
                Route::get('list', ['as' => 'getListCate', 'uses' => 'Admin\CategoryController@getList']);

                // hiển thị form thêm loại tin
                Route::get('insert', ['as' => 'getInsertCate', 'uses' => 'Admin\CategoryController@getInsert']);

                // nhận request method post từ trang thêm gủi về để tiến hành insert dữ liệu
                Route::post('insert', ['as' => 'postInsertCate', 'uses' => 'Admin\CategoryController@postInsert']);

                // hiển thị form cập nhật dữ liệu
                Route::get('update/{id}', ['as' => 'getUpdateCate', 'uses' => 'Admin\CategoryController@getUpdate']);

                // nhận request method post từ trang update gủi về để tiến hành update dữ liệu
                Route::post('update/{id}', ['as' => 'postUpdateCate', 'uses' => 'Admin\CategoryController@postUpdate']);

                // xóa loại tin
                Route::get('delete/{id}', ['as' => 'getDeleteCate', 'uses' => 'Admin\CategoryController@getDelete']);
            });

        });
    

Tạo controller xử lý trang quản lý loại tin:

        $ php artisan make:controller Admin\CategoryController
    

Thêm mới một loại tin

Sử dụng route gủi request tới CategoryController cụ thể là function getInsert() trong CategoryController

function này sẽ return về view insert, cụ thể là file resources/views/admin/category/insert.blade.php

        public function getInsert(){
            $categories = Category::all();
            return view('admin.category.insert', compact('categories'));
        }
    

view thêm loại tin resources/views/admin/category/insert.blade.php có nội dung như sau:

        @extends('admin.base.base')
        @section('title')
            Thêm tin
        @endsection
        @section('content')
            

Tin tức quản lý

Thêm tin tức

{{ empty($errors->messages()['txtName']) ? '' : showError($errors->messages()['txtName']) }}
{{ empty($errors->messages()['txtDescription']) ? '' : showError($errors->messages()['txtDescription']) }}
@endsection

Validate Form

        $ php artisan make:request CateRequest
    

Mở file app/Http/RequestsCateRequest.php

        namespace App\Http\Requests;

        use Illuminate\Foundation\Http\FormRequest;

        class CateRequest extends FormRequest
        {
            /**
             * Determine if the user is authorized to make this request.
             *
             * @return bool
             */
            public function authorize()
            {
                return true;
            }

            /**
             * Get the validation rules that apply to the request.
             *
             * @return array
             */
            public function rules()
            {
                $postId = $this->route()->parameter('id');
                return [
                    'txtName' => 'required|unique:categories,name,'.$postId,
                    'txtDescription' => 'required',
                ];
            }

            public function messages()
            {
                return [
                  'txtName.required' => 'Bạn chưa nhập tên loại tin',
                  'txtName.unique' => 'Tên loại tin đã tồn tại',
                  'txtDescription.required' => 'Bạn chưa nhập mô tả',
                ];
            }
        }
    

Chú ý: action form phải gủi về route postInsertCate

Sau khi nhấn submit sẻ sử dụng route postInsertCate gủi request tới CategoryController cụ thể là function postInsert() trong CategoryController

function này có nhiệm vụ gửi request tới model là file app/Category.php để tiến hành giao tiếp với database để insert dữ liệu

         public function postInsert(CateRequest $request){
            $cate =  new Category();
            $cate->name = $request->txtName;
            $cate->parent_id = $request->selCategory;
            $cate->description = $request->txtDescription;
            $cate->alias = changeTitle($request->txtName);
            $cate->status = empty($request->txtStatus) ? 1 : 0;
            $cate->save();
           // return redirect('administrator/category/list')->with(['success' => 'Thêm thành công']);
        }
    

Hàm changeTitle ở dâu ra? ^_^

Bạn download: tại đây

Sau đó giải nén vào thư mục app. Mở file composer.json thêm vào dòng

        "autoload": {
            ...,
            "files": [
                "app/function/ChangeTitle.php"
            ]
        },
    

Sau đó chạy lênh sau là có thể sử dụng nó:

        $ composer dump-autoload
    

Form insert

Validate form

Hiển thị danh sách loại tin

Sử dụng route getListCate gủi request tới CategoryController cụ thể là function getList() trong CategoryController

function này sẽ lấy tất cả dữ liệu bảng categories tryền qua view list, cụ thể là file resources/views/admin/category/list.blade.php

          public function getList(){
              $categories = Category::all();
              return view('admin.category.list', compact('categories'));
          }
    

view danh sách loại tin resources/views/admin/category/list.blade.php có nội dung như sau:

        @extends('admin.base.base')
        @section('title')
            Danh sách tin
        @endsection
        @section('css')
                
            
        @endsection
        @section('content')
            

Danh mục quản lý

Danh sách Tin

@foreach($categories as $category) @endforeach
Tên Mô tả Hiển thị
{{ $category->name }} {{ $category->description }} {{ $category->status == 1 ? 'Có' : 'Không'}}
Tên Mô tả Hiển thị
@endsection @section('javascript') @endsection

Danh sách

Cập nhật một loại tin

Sử dụng route getUpdateCate gủi request tới CategoryController cụ thể là function getUpdate() trong CategoryController

function này sẽ lấy dữ liệu column cần cập nhật trong bảng categories truyền qua view update, cụ thể là file resources/views/admin/category/update.blade.php

           public function getUpdate($id){
                $cate = Category::find($id);
                $categories = Category::all();
                return view('admin.category.update', compact('cate', 'categories'));
           }
    

view danh sách loại tin resources/views/admin/category/update.blade.php có nội dung như sau:

        @extends('admin.base.base')
        @section('title')
            Cập nhật tin
        @endsection
        @section('content')
            

Tin tức quản lý

Cập nhật tin tức

{{ empty($errors->messages()['txtName']) ? '' : showError($errors->messages()['txtName']) }}
{{ empty($errors->messages()['txtDescription']) ? '' : showError($errors->messages()['txtDescription']) }}
status == 1 ? 'checked' : '' }}>
Làm mới Hủy
@endsection

Sau khi nhấn submit sẻ sử dụng route postUpdateCate gủi request tới CategoryController cụ thể là function postUpdate() trong CategoryController

function này có nhiệm vụ gửi request tới model là file app/Category.php để tiến hành giao tiếp với database để update dữ liệu

        public function postUpdate(CateRequest $request, $id){
            $cate = Category::find($id);
            $cate->name = $request->txtName;
            $cate->parent_id = $request->selCategory;
            $cate->description = $request->txtDescription;
            $cate->alias = changeTitle($request->txtName);
            $cate->status = empty($request->txtStatus) ? 0 : 1;
            $cate->update();
            return redirect('administrator/category/list')->with(['success' => 'Cập nhật thành công']);
        }
    

Xóa một loại tin

Sử dụng route getDelete gủi request tới CategoryController cụ thể là function getDelete() trong CategoryController

function này sẽ lấy dữ liệu column cần xóa trong bảng categories để tiến hành xóa

        public function getDelete($id){
            $cate = Category::find($id);
            $cate->delete();
            return redirect('administrator/category/list')->with(['success' => 'Xóa thành công']);
        }
    

Soure code: download

Trong bài này mình đã giới thiệu về Eloquent trong Laravel 5 và hướng dẫn các bạn ứng dụng Eloquent tạo trang quản lý loại tin. Trong series bài viết tiếp theo mình sẽ hướng dẫn các bạn tạo chức năng thêm, sữa, xóa cho trang articles. Mời các bạn đón đọc. Bài viết trên là những hiểu biết của cá nhân mình nên không tránh phải sai sót, rất mong sự đóng góp ý kiến của các bạn để bài viết trở nên hữu ích hơn.