Thursday, January 29, 2015

Truy vấn nâng cao với Laravel query builder

Truy vấn CSDL thuận tiện và mềm dẻo, có thể hỗ trợ hầu hết các thao tác với CSDL và support nhiều loại CSDL khác nhau.
Sau đây là 1 số cách truy vấn hữu dụng trong 1 số tình huống phức tạp

1. JOINS

Basic Join Statement
DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.id', 'contacts.phone', 'orders.price')
            ->get();
Left Join Statement
DB::table('users')
        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->get();
Advanced join clauses
DB::table('users')
        ->join('contacts', function($join)
        {
            $join->on('users.id', '=', 'contacts.user_id')->orOn(...);
        })
        ->get();
Trường hợp muốn sử dụng thêm điều kiện "Where" trong lệnh JOINS


DB::table('users')
        ->join('contacts', function($join)
        {
            $join->on('users.id', '=', 'contacts.user_id')
                 ->where('contacts.user_id', '>', 5);
        })
        ->get();

2. ADVANCED WHERE

Parameter Grouping


DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function($query)
            {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();
Câu lệnh truy vấn sẽ như sau:
select * from users where name = 'John' or (votes > 100 and title <> 'Admin')


Exists Statements
DB::table('users')
            ->whereExists(function($query)
            {
                $query->select(DB::raw(1))
                      ->from('orders')
                      ->whereRaw('orders.user_id = users.id');
            })
            ->get();
Câu lệnh truy vấn sẽ như sau:
select * from users
where exists (
    select 1 from orders where orders.user_id = users.id
)

3. KẾT HỢP TRUY VẤN THUẦN (RAW)
Đôi khi bạn buộc phải lồng các truy vấn thuần vào câu lệnh như dưới đây, hãy lưu ý để tránh bị lỗi SQL Injection
$users = DB::table('users')
                     ->select(DB::raw('count(*) as user_count, status'))
                     ->where('status', '<>', 1)
                     ->groupBy('status')
                     ->get();
Source: http://laravel.com/docs/4.2/queries

3 comments:

  1. Add có thể giúp em chuyển câu lệnh SQL sang query builder

    ReplyDelete
  2. SELECT * FROM sanpham, sanpham_tinhnang_loai WHERE sanpham.id=sanpham_tinhnang_loai.idsanpham and idtinhnangloai in(1,15) group by idsanpham

    ReplyDelete
  3. bảng sản phẩm có các cột: id, ten và bảng sanpham_tinhnang_loai có cột idsanpham, idtinhnangloai
    Tks anh

    ReplyDelete