/ / Laravel Framework / Comments (4)

Laravel Framework: sử dụng Query Builder

Qua bài trước mình đã hướng dẫn cho các bạn cách cấu hình các thông tin để kết nối tới cơ sở dữ liệu trong Laravel.Các bạn có thể thấy trong Laravel có rất nhiều cách để làm việc với cơ sở dữ liệu,trong bài này mình sẽ hướng dẫn cho các bạn về Query Builder.Query Builder giúp ta trong việc thao tác cỡ sở dữ liệu một cách thuận lợi hơn,với những câu lệnh truy vấn đơn giản thân thiện để tạo và chạy những truy vấn từ CSDL. Nó thường được sử dụng để thực thi hầu hết những thao tác về CSDL trong ứng dụng của bạn, và làm việc với tất cả những CSDL được hổ trợ.Query Builder sử dụng PDO nhằm bảo vệ ưng dụng và tránh các lỗi về SQL injection.Query Builder xây dựng lớp DB để thực hiện các câu truy vấn.Chúng ta sẽ cùng đi tìm hiểu các phương thức quan trọng trong lớp DB này nhé.
– Để phục vụ cho loạt ví dụ ở dưới chúng ta cùng tạo 1 bảng dữ liệu để thực hành nhé.

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(128) CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=12 ;

sử dụng Query Builder trong Laravel Framework

Sử dụng truy vấn lấy dữ liệu

1.Lấy tất cả dữ liệu trong bảng

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

Và kết quả sẽ được như sau:

Array
(
     [0] => stdClass Object
     (
           [id] => 12
           [name] => nobita
     )
     [1] => stdClass Object
     (
           [id] => 13
           [name] => xuka
     )
)

2.Truy vấn lấy 1 dòng dữ liệu từ bảng CSDL

$user = DB::table('users')->where('id', '12')->first();
print_r($user);

Và kết quả sẽ như sau:

stdClass Object
(
      [id] => 12
      [name] => nobita
)

3.Truy vấn một cột từ một hàng đơn

$name = DB::table('users')->where('id', '12')->pluck('name');
echo $name;

Và kết quả sẽ trả về là nobita
4.Lấy danh sách các cột giá trị

$users = DB::table('users')->lists('name');
print_r($users);

Và kết quả sẽ như sau:

Array
(
      [0] => nobita
      [1] => xuka
)

Ngoài ra các bạn có thể tùy chỉnh lấy danh sách các cột giá trị theo tùy chỉnh dạng key => value
Cú pháp lists(tên cột 1,tên cột 2) sẽ trả về dữ liệu dạng array('giá trị cột 2' => 'giá trị cột 1');

$users = DB::table('users')->lists('name','email');
print_r($users);

Và kết quả sẽ như sau:

Array
(
      [nobita@gmail.com] => nobita
      [xuka@gmail.com] => xuka
)

Cách này cũng tương đương với việc ta sử dụng cách sau:

$list  = array();
$users = DB::table('user')->select('name', 'email')->get();
foreach ($users as $row)
{
   $list[$row->email] = $row->name;
}
print_r($list);

Đây cũng là trường hợp mà sẽ được sử dụng nhiều trong lúc làm việc,trước kia thì chúng ta phải sử dụng cách thứ 2,nhưng trong laravel đã hỗ trợ hàm này ngắn gọn và hiệu quả hơn.
5. Sử dụng mệnh đề select

$users = DB::table('users')->select('id', 'name')->get();

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

$users = DB::table('users')->select('name as user_name')->get();

6.Sử dụng từ khóa where,thêm điều kiện

$users = DB::table('users')->where('id', '>', 100)->get();

– Hoặc câu lệnh orWhere

$users = DB::table('users')
->where('id', '>', 100)
->orWhere('name', 'nobita')
->get();

– Sử dụng where between

$users = DB::table('users')
->whereBetween('id', array(1, 100))->get();

– Sử dụng where not between

$users = DB::table('users')
->whereNotBetween('id', array(1, 100))->get();

– Sử dụng where trong 1 mảng hoặc không thuộc 1 mảng

$users = DB::table('users')
->whereIn('id', array(1, 2, 3))->get();
$users = DB::table('users')
->whereNotIn('id', array(1, 2, 3))->get();

– Sử dụng where với giá trị null hoặc có giá trị trả về nhưng lại không đặt giá trị

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

– Đôi khi bạn cần tạo mệnh đề where phức tạp như “where exists”:

DB::table('users')
            ->whereExists(function($query)
            {
                $query->select(DB::raw(1))
                      ->from('orders')
                      ->whereRaw('orders.user_id = users.id');
            })
            ->get();

Với câu lệnh trên sẽ sinh cho ta câu lệnh sql như sau:

select * from users
where exists (
    select 1 from orders where orders.user_id = users.id
)

– Hay những mềnh đề where lồng nhau

DB::table('users')
            ->where('name', '=', 'nobita')
            ->orWhere(function($query)
            {
                $query->where('id', '>', 100)
                      ->where('email', '<>', 'nobitacnt@gmail.com');
            })
            ->get();

Với câu lệnh trên sẽ sinh cho ta câu lệnh sql như sau:

select * from users where name = 'nobita' or (id > 100 and email <> 'nobitacnt@gmail.com')

7.Sử dụng Order By, Group By, và Having

users = DB::table('users')
->orderBy('name', 'desc')
->groupBy('count')
->having('count', '>', 100)
->get();

8.Offset & Limit

$users = DB::table('users')->skip(10)->take(5)->get();

Join bảng dữ liệu

1.Câu lệnh Join cơ bản:

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();

2.Câu lệnh join trái

DB::table('users')
        ->leftJoin('orders', 'users.id', '=', 'orders.user_id')
        ->get();

3.Bạn cũng có thể nâng cấp với mệnh đề join

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

4.Nếu bạn muốn sử dụng “where” trong mệnh đề join, bạn có thể sử dụng phương thức where và orwhere trong mệnh đề join. Thay vì so sánh 2 cột, những phương thức đó sẽ so sánh thêm cột giá trị lần nữa.

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

Hàm

Trong Laravel cũng có những hàm trong SQL như

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
$price = DB::table('orders')->min('price');
$price = DB::table('orders')->avg('price');
$total = DB::table('users')->sum('votes');

Raw Expressions

– Trong một số trường hợp ta cần sử dụng mã SQL nguyên mẫu trong loạt truy vấn của mình. Laravel cung cấp cho bạn phương thức DB::raw

$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();

– Tăng hoặc giảm giá trị của một cột

DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);

Câu lệnh inserts dữ liệu

1.Chèn một hàng giá trị vào 1 bảng

DB::table('users')->insert(
array('email' => 'john@example.com', 'votes' => 0)
)

2.Nếu bảng có id tự động tăng, thì ban dùng insertGetId để chèn và và lấy Id

$id = DB::table('users')->insertGetId(
    array('email' => 'john@example.com', 'votes' => 0)
);

3.Thêm nhiều records vào một bảng

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

Câu lệnh Updates dữ liệu

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

Câu lênh Deletes dữ liệu

1.Xóa 1 record tại một bảng

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

2.Xóa toàn bộ record trên bảng

DB::table('users')->delete();

3.Xóa nội dung của bảng

DB::table('users')->truncate();

Câu lệnh Union

$first = DB::table('users')->whereNull('first_name');
$users = DB::table('users')->whereNull('last_name')->union($first)->get();

– Kết thúc bài viết: Qua bài này mình đã giới thiệu cho các bạn các phương thức quan trọng trong Query Builder.Các bạn thấy nó khá ngắn gọn và dễ sử dụng phải không nào,từ những câu lệnh truy vấn đến phức tạp.Ngoài ra Query Builder còn nhiều phương thức khác,bài viết được tham khảo tại trang chủ của Laravel các bạn có thể vào đây để tìm hiểu thêm các phương thức khác nhé.Sang bài tiếp theo mình sẽ giới thiệu cho các bạn về Eloquent ORM trong Laravel



25/09/2014
Written by nobitacnt

Trong bài viết không tránh khỏi những câu từ chưa chính xác,mong nhận được sự góp ý để website hoàn thiện hơn.Nếu thấy bài viết có ích với bạn hãy like và share để ủng hộ nhé :D.

Bài viết chùng chuyên mục

4 Comments

  1. Hoang Minh says:
     /  Reply

    Cảm ơn đã chia sẽ,bài viết rất hữu ích cho mình

  2. vodanh says:
     /  Reply

    Nếu các bạn muốn lấy thêm nhiều trường dữ liệu thì có thể sử dụng:
    $users = DB::table(‘users’)->lists(‘name’,’email’,’phone’);

    Theo mình cách hiểu của bạn có vấn đề về chỗ đoạn này.

    • nobitacnt says:
       /  Reply

      Cảm ơn góp ý quý báu của bạn,Mình hơi sơ sót chỗ này,nhiều lúc chả kịp test lại 😀 ,đã fix

  3. Thang says:
     /  Reply

    Cảm ơn bài viết rất hay.

Gửi bình luận

Giới thiệu

Mình tạo ra blog này với mong muốn chia sẻ và học hỏi kinh nghiệm trong quá trình thiết kế website. Website đang trong quá trình phát triển chân thành cảm ơn mọi sự góp ý của các bạn để làm cho website ngày càng hoàn thiên.

DMCA.com Protection Status
Theo dõi qua Email

Tổng hợp các bài viết về

Hoc php - CodeIgniter Framework - Laravel Framework - PHP va MYSQL