CHƯƠNG 3 : HIỆN THỰC MƠ HÌNH MVC
3.4 TRUY VẤN DỮ LIỆU
3.4.4. TRUY VẤN DỮ LIỆU QUAN HỆ
Việc phát triển ứng dụng tách biệt với hệ quản trị cơ sở dữ liệu là yêu cầu thiết yếu của các ứng ụng. Khi việc chuyển đổi hệ quản trị không ảnh hưởng tới ứng dụng. ORM (Object-relational mapping) là kỹ thuật lập trình giúp ánh xạ các record dữ liệu sang đối tượng.
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
$deleted = DB::delete('delete from users');
DB::statement('drop table users');
$result = DB::table('users')->insert(['email' => 'john@example.com', 'votes' => 0]
Hình 3- 1 Kiến trúc tổng quan ứng dụng
Với kỹ thuật như trên, việc tương tác với database do ORM quản lý. Khi đó tầng ứng dụng chỉ cần sử dụng những gì ORM cung cấp để phát triển ứng dụng. Laravel hiện thực tầng ORM với hai kỹ thuật: query builder và eloquent ORM.
Ví dụ sử dụng query builder để thực hiện truy vấn dữ liệu
Ví dụ sử dụng eloquent để thực hiện truy vấn dữ liệu
Laravel hỗ trợ tương tác với bốn cơ sở dữ liệu
MySQL
PostgreSQL
SQLite
SQL Server
Ngoài bốn phương thức cơ bản (select, insert, update, delete) như mô tả ở trên do query builder cung cấp. Trong phần này mô tả thêm các phương thức khác.
Laravel query builder dùng kỹ thuật PDO để bảo vệ cơ sở dữ liệu tránh các lỗi tấn công SQL injection. Do đó, khơng cần thực hiện thêm thao tác xóa ký tự đặc biệt, xóa các mã độc, …
Lấy tất cả các hàng từ một bảng
$results = DB::select('select * from users);
Dùng phương thức table trong DB để thực hiện truy vấn.
Lấy một dòng với các điều kiện
Lấy dòng dữ liệu đầu tiên (trong số nhiều dòng thỏa điều kiện)
Chỉ định rõ các cột cần lấy trong truy vấn select
Quan hệ inner join
Laravel query builder cung cấp phương thức join để xử lý các vấn đề quan hệ inner join trong cơ sở dữ liệu. Nhờ đó, ứng dụng có thể truy vấn quan hệ trên nhiều bảng dữ liệu khác nhau.
$users = DB::table('users')->get(); foreach ($users as $user) {
echo $user->name; }
$user = DB::table('users')->where('name', 'John')->first(); echo $user->name;
$users = DB::table('users')->select('name', 'email as user_email')- >get();
$users = DB::table('users')
->join('contacts', 'users.id', '=', 'contacts.user_id') ->join('orders', 'users.id', '=', 'orders.user_id') ->select('users.*', 'contacts.phone', 'orders.price') ->get();
Quan hệ left join
3.5 BÀI TẬP
1) Tiếp tục phát triển bài tập tại mục 2.3), trong đó dữ liệu được truy vấn từ database Thiết kế database đề nghị như sau:
a) Thay đổi thiết kế database sao cho phù hợp với yêu cầu b) Tạo dữ liệu mẫu cho các bảng dữ liệu
c) Hiển thị dữ liệu được truy vấn từ cơ sở dữ liệu $users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id') ->get();