Bài 14. Sử dụng Query Builder trong Laravel 5

Bài trước mình đã giới thiệu về Middleware trong Laravel 5 và tạo Middleware cho website tin tức. Bài hôm nay chúng ta sẽ đi tìm hiểu về Query Builder trong Laravel 5 và sẽ hướng dẫn các bạn áp dụng Eloquent ORMQuery Builder để hiển thị tin lên trang chủ.

Mục Lục:

1. Giới thiệu về Query Builder

Query Builder cung cấp 1 giao diện tiện lợi và để dàng tạo và chạy truy vấn cơ sở dữ liệu. Nó có thể được sử dụng để thực thi hầu hết những thao tác về cơ sở dữ liệu trong ứng dụng của bạn và làm việc với tất cả những cơ sở dữ liệu được hỗ trợ.

Query Builder sử dụng tham số PDO ràng buộc để bảo vệ ứng dụng của bạn chống lại các cuộc tấn công SQL injection.

2. Các truy vấn cơ bản trong Query Builder

Lấy tất cả dữ liệu bảng ghi

        $users = DB::table('users')->get();
    

Lấy 1 bảng ghi theo trường xác định

        $user = DB::table('users')->where('name', 'John')->get();
    

Lấy 1 hàng của bảng ghi

        $user = DB::table('users')->where('name', 'John')->first();
    

Lấy 1 trường của bảng ghi

        $email = DB::table('users')->where('name', 'John')->value('email');
    

Insert

        DB::table('users')->insert([
            ['email' => 'taylor@example.com', 'votes' => 0],
            ['email' => 'dayle@example.com', 'votes' => 0]
        ]);
    

Update

        DB::table('users')
            ->where('id', 1)
            ->update(['votes' => 1]);
    

Delete

        DB::table('users')->where('votes', '>', 100)->delete();
    

3. So sánh Eloquent ORM và Query Builder

  • Tính bảo mật:

    Query Builder sử dụng tham số PDO ràng buộc để bảo vệ ứng dụng của bạn chống lại các cuộc tấn công SQL injection còn Eloquent ORM thì chưa làm được.

  • Tính tương tác:

    Bạn có thể sử dụng tất cả các function của Query Builder trong Eloquent nhưng không thể sử dụng các funcation của Eloquent trong Query Builder.

  • Sử dụng:
    • Eloquent ORM sử dụng câu lệnh ngắn gọn, dể hiểu hơn Query Builder.
    • Eloquent ORM dễ dàng kết nối các bảng với nhau.
    • Query Builder có thể thực hiện các lệnh truy vấn phước tạp hơn Eloquent ORM.
  • Hiệu suất:

    Eloquent ORM bị chậm hơn so với Query Builder, nhất là ở những truy vấn cần thao tác với dữ liệu lớn.

4. Hiển thị tin lên trang chủ - Dự án website tin tức

Chuẩn bị giao diện trang chủ: cái này mình đã chuẩn bị cho các bạn rồi. Download: tại đây

Các bạn giải nén vào thư mục resources/views

file style.css bạn cut vào thư mục public public/home/css/style.css

Tạo route test thử giao diện nào:

        Route::get('', function (){
            return view('home.base.base');
        });
    

Những phần mình khoanh màu đỏ là những phần sẽ giữ cố định của trang web. Dù có đi tới trang chi tiết bài viết,... thì nó đều hiển thị

Tạo Route

        Route::get('/', ['as' => 'home', 'uses' => 'Home\HomeController@index']);
    

Tạo Controller

        $ php artisan make:controller Home/BaseController
        $ php artisan make:controller Home/HomeController
    

BaseController sẽ là class cha

HomeController sẽ extends từ BaseController

Phần mainmenu, leftbar, rightbar là những phần mà ta cần truy xuất dữ liệu từ database và là những thành phần cố định nên ta sẽ viết trong BaseController

Nội dung class BaseController

        namespace App\Http\Controllers\Home;
        use View;
        use Illuminate\Http\Request;
        use App\Http\Controllers\Controller;
        use Illuminate\Support\Facades\DB;

        class BaseController extends Controller
        {
            function __construct()
            {
                // mainmenu
                $categories = DB::table('categories')
                    ->where('categories.status', '=', 1)
                    ->where('categories.parent_id', '=', 0)
                    ->select('categories.name', 'categories.alias')
                    ->get();
                // leftbar
                $cate_child = DB::table('categories')
                    ->where('categories.status', '=', 1)
                    ->where('categories.parent_id', '<>', 0)
                    ->select('categories.name', 'categories.alias')
                    ->get();
                // rightbar
                $highlights = DB::table('articles')
                    ->where('articles.status', '=', 1)
                    ->orderBy('articles.created_at')
                    ->take(5)
                    ->get();

                View::share('categories', $categories);
                View::share('highlights', $highlights);
                View::share('cate_child', $cate_child);
            }
        }
    

Ở đây, để cho các view có thể nhận được dữ liệu thì mình dùng view share. Cấu trúc view share cũng khá đơn giản

         View::share('key', 'value');
    

Nội dung class HomeController

        namespace App\Http\Controllers\Home;
        use Illuminate\Http\Request;
        use App\Http\Controllers\Controller;

        class HomeController extends BaseController
        {
            public function index ()
            {
                return view('home.index');
            }
        }
    

Nội dung file resources/views/home/base/mainmenu.blade.php

        
    

Nội dung file resources/views/home/base/leftbar.blade.php

        

Nội dung file resources/views/home/base/rightbar.blade.php

        
    

Nội dung file resources/views/home/base/base.blade.php

        
@include('home.base.header') @include('home.base.mainmenu')
@yield('content') @include('home.base.rightbar') @include('home.base.leftbar')
@include('home.base.footer')

Nội dung file resources/views/home/index.blade.php

        @extends('home.base.base')
        @section('title', 'Trang chủ')
        @section('content')
        // bài sau xử lý
        @endsection
    

Test thử nào: http://localhost/tintuc/public

Trong bài này mình đã giới thiệu về Query Builder trong Laravel 5 và hướng dẫn các bạn áp dụng Query Builder để hiển thị tin lên trang chủ. Trong series bài viết tiếp theo mình sẽ hướng dẫn các bạn về Pagination trong Laravel 5 và hiển thị list tin tức trên trang chủ.