Cách sử dụng cơ sở dữ liệu (dựa trên thành phần cơ sở dữ liệu Laravel)
Lấy tất cả các hàng
<?php
namespace app\controller;
use support\Request;
use support\Db;
class UserController
{
public function all(Request $request)
{
$users = Db::table('users')->get();
return view('user/all', ['users' => $users]);
}
}
Lấy các cột chỉ định
$users = Db::table('user')->select('name', 'email as user_email')->get();
Lấy một hàng
$user = Db::table('users')->where('name', 'John')->first();
Lấy một cột
$titles = Db::table('roles')->pluck('title');
Chỉ định giá trị của trường id làm chỉ mục
$roles = Db::table('roles')->pluck('title', 'id');
foreach ($roles as $id => $title) {
echo $title;
}
Lấy một giá trị (trường)
$email = Db::table('users')->where('name', 'John')->value('email');
Xóa trùng lặp
$email = Db::table('user')->select('nickname')->distinct()->get();
Kết quả theo từng khối
Nếu bạn cần xử lý hàng nghìn bản ghi trong cơ sở dữ liệu, việc đọc tất cả dữ liệu đó một lần sẽ rất tốn kém và có thể dẫn đến quá tải bộ nhớ, lúc này bạn có thể xem xét việc sử dụng chunkById phương thức. Phương thức này lấy một phần nhỏ của bộ kết quả mỗi lần, và chuyển nó đến hàm đóng để xử lý. Ví dụ, chúng ta có thể chia toàn bộ dữ liệu của bảng users thành những phần nhỏ gồm 100 bản ghi:
Db::table('users')->orderBy('id')->chunkById(100, function ($users) {
foreach ($users as $user) {
//
}
});
Bạn có thể dừng việc lấy kết quả theo từng khối bằng cách trả về false trong hàm đóng.
Db::table('users')->orderBy('id')->chunkById(100, function ($users) {
// Xử lý các bản ghi...
return false;
});
Chú ý: Không xóa dữ liệu trong callback, vì điều đó có thể dẫn đến việc một số bản ghi không được bao gồm trong bộ kết quả
Tổng hợp
Trình tạo truy vấn cũng cung cấp nhiều phương thức tổng hợp khác nhau, chẳng hạn như count, max, min, avg, sum, v.v.
$users = Db::table('users')->count();
$price = Db::table('orders')->max('price');
$price = Db::table('orders')->where('finalized', 1)->avg('price');
Kiểm tra sự tồn tại của bản ghi
return Db::table('orders')->where('finalized', 1)->exists();
return Db::table('orders')->where('finalized', 1)->doesntExist();
Biểu thức nguyên thủy
Nguyên mẫu
selectRaw($expression, $bindings = [])
Đôi khi bạn có thể cần sử dụng biểu thức nguyên thủy trong truy vấn. Bạn có thể sử dụng selectRaw()
để tạo một biểu thức nguyên thủy:
$orders = Db::table('orders')
->selectRaw('price * ? as price_with_tax', [1.0825])
->get();
Tương tự, còn có các phương thức biểu thức nguyên thủy như whereRaw()
, orWhereRaw()
, havingRaw()
, orHavingRaw()
, orderByRaw()
, groupByRaw()
.
Db::raw($value)
cũng được sử dụng để tạo một biểu thức nguyên thủy, nhưng nó không có chức năng liên kết tham số, vì vậy cần cẩn thận với vấn đề SQL injection khi sử dụng.
$orders = Db::table('orders')
->select('department', Db::raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > ?', [2500])
->get();
Câu lệnh Join
// join
$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();
// leftJoin
$users = Db::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
// rightJoin
$users = Db::table('users')
->rightJoin('posts', 'users.id', '=', 'posts.user_id')
->get();
// crossJoin
$users = Db::table('sizes')
->crossJoin('colors')
->get();
Câu lệnh Union
$first = Db::table('users')
->whereNull('first_name');
$users = Db::table('users')
->whereNull('last_name')
->union($first)
->get();
Câu lệnh Where
Nguyên mẫu
where($column, $operator = null, $value = null)
Tham số đầu tiên là tên cột, tham số thứ hai là bất kỳ toán tử nào được hệ thống cơ sở dữ liệu hỗ trợ, tham số thứ ba là giá trị cần so sánh cột đó
$users = Db::table('users')->where('votes', '=', 100)->get();
// Khi toán tử là '=' có thể bỏ qua, vì vậy câu lệnh này có cùng ý nghĩa với câu lệnh trên
$users = Db::table('users')->where('votes', 100)->get();
$users = Db::table('users')
->where('votes', '>=', 100)
->get();
$users = Db::table('users')
->where('votes', '<>', 100)
->get();
$users = Db::table('users')
->where('name', 'like', 'T%')
->get();
Bạn cũng có thể truyền mảng điều kiện vào hàm where:
$users = Db::table('users')->where([
['status', '=', '1'],
['subscribed', '<>', '1'],
])->get();
Phương thức orWhere cũng nhận các tham số giống như phương thức where:
$users = Db::table('users')
->where('votes', '>', 100)
->orWhere('name', 'John')
->get();
Bạn có thể truyền một hàm đóng cho phương thức orWhere như tham số đầu tiên:
// SQL: select * from users where votes > 100 or (name = 'Abigail' and votes > 50)
$users = Db::table('users')
->where('votes', '>', 100)
->orWhere(function($query) {
$query->where('name', 'Abigail')
->where('votes', '>', 50);
})
->get();
whereBetween / orWhereBetween kiểm tra xem giá trị trường có nằm trong hai giá trị đã cho không:
$users = Db::table('users')
->whereBetween('votes', [1, 100])
->get();
whereNotBetween / orWhereNotBetween kiểm tra xem giá trị trường có nằm ngoài hai giá trị đã cho không:
$users = Db::table('users')
->whereNotBetween('votes', [1, 100])
->get();
whereIn / whereNotIn / orWhereIn / orWhereNotIn kiểm tra xem giá trị của trường phải tồn tại trong mảng đã chỉ định:
$users = Db::table('users')
->whereIn('id', [1, 2, 3])
->get();
whereNull / whereNotNull / orWhereNull / orWhereNotNull kiểm tra xem trường đã chỉ định có phải là NULL không:
$users = Db::table('users')
->whereNull('updated_at')
->get();
whereNotNull kiểm tra xem trường đã chỉ định có phải không phải là NULL không:
$users = Db::table('users')
->whereNotNull('updated_at')
->get();
whereDate / whereMonth / whereDay / whereYear / whereTime được sử dụng để so sánh giá trị trường với ngày đã cho:
$users = Db::table('users')
->whereDate('created_at', '2016-12-31')
->get();
whereColumn / orWhereColumn được sử dụng để so sánh hai giá trị trường có bằng nhau không:
$users = Db::table('users')
->whereColumn('first_name', 'last_name')
->get();
// Bạn cũng có thể truyền vào một toán tử so sánh
$users = Db::table('users')
->whereColumn('updated_at', '>', 'created_at')
->get();
// whereColumn cũng có thể nhận mảng
$users = Db::table('users')
->whereColumn([
['first_name', '=', 'last_name'],
['updated_at', '>', 'created_at'],
])->get();
Nhóm tham số
// select * from users where name = 'John' and (votes > 100 or title = 'Admin')
$users = Db::table('users')
->where('name', '=', 'John')
->where(function ($query) {
$query->where('votes', '>', 100)
->orWhere('title', '=', 'Admin');
})
->get();
whereExists
// select * from users where exists ( select 1 from orders where orders.user_id = users.id )
$users = Db::table('users')
->whereExists(function ($query) {
$query->select(Db::raw(1))
->from('orders')
->whereRaw('orders.user_id = users.id');
})
->get();
orderBy
$users = Db::table('users')
->orderBy('name', 'desc')
->get();
Sắp xếp ngẫu nhiên
$randomUser = Db::table('users')
->inRandomOrder()
->first();
Sắp xếp ngẫu nhiên có thể ảnh hưởng lớn đến hiệu suất của máy chủ, không nên sử dụng
groupBy / having
$users = Db::table('users')
->groupBy('account_id')
->having('account_id', '>', 100)
->get();
// Bạn có thể truyền nhiều tham số cho phương thức groupBy
$users = Db::table('users')
->groupBy('first_name', 'status')
->having('account_id', '>', 100)
->get();
offset / limit
$users = Db::table('users')
->offset(10)
->limit(5)
->get();
Chèn
Chèn một bản ghi
Db::table('users')->insert(
['email' => 'john@example.com', 'votes' => 0]
);
Chèn nhiều bản ghi
Db::table('users')->insert([
['email' => 'taylor@example.com', 'votes' => 0],
['email' => 'dayle@example.com', 'votes' => 0]
]);
Tăng ID tự động
$id = Db::table('users')->insertGetId(
['email' => 'john@example.com', 'votes' => 0]
);
Chú ý: Khi sử dụng PostgreSQL, phương thức insertGetId sẽ mặc định sử dụng id như tên của trường tự động tăng. Nếu bạn muốn lấy ID từ một「dãy」khác, bạn có thể truyền tên trường như tham số thứ hai cho phương thức insertGetId.
Cập nhật
$affected = Db::table('users')
->where('id', 1)
->update(['votes' => 1]);
Cập nhật hoặc chèn
Đôi khi bạn có thể muốn cập nhật bản ghi hiện có trong cơ sở dữ liệu, hoặc nếu không có bản ghi nào khớp thì tạo một bản ghi mới:
Db::table('users')
->updateOrInsert(
['email' => 'john@example.com', 'name' => 'John'],
['votes' => '2']
);
Phương thức updateOrInsert sẽ cố gắng tìm kiếm bản ghi trong cơ sở dữ liệu với các khóa và giá trị của tham số đầu tiên. Nếu bản ghi tồn tại, nó sẽ cập nhật bản ghi với các giá trị trong tham số thứ hai. Nếu không tìm thấy bản ghi, nó sẽ chèn một bản ghi mới, dữ liệu của bản ghi mới là sự kết hợp của hai mảng.
Tăng & Giảm
Hai phương thức này đều nhận ít nhất một tham số: cột cần sửa đổi. Tham số thứ hai là tùy chọn, được sử dụng để kiểm soát mức độ tăng hoặc giảm của cột:
Db::table('users')->increment('votes');
Db::table('users')->increment('votes', 5);
Db::table('users')->decrement('votes');
Db::table('users')->decrement('votes', 5);
Bạn cũng có thể chỉ định các trường cần cập nhật trong quá trình thao tác:
Db::table('users')->increment('votes', 1, ['name' => 'John']);
Xóa
Db::table('users')->delete();
Db::table('users')->where('votes', '>', 100)->delete();
Nếu bạn cần xóa toàn bộ bảng, bạn có thể sử dụng phương pháp truncate, nó sẽ xóa tất cả các hàng và đặt ID tự động về 0:
Db::table('users')->truncate();
Giao dịch
Khóa thận trọng
Trình tạo truy vấn cũng chứa một số hàm có thể giúp bạn thực hiện "khóa thận trọng" trong cú pháp select. Để thực hiện một "khóa chia sẻ" trong truy vấn, bạn có thể sử dụng sharedLock phương thức. Khóa chia sẻ có thể ngăn chặn các cột dữ liệu đã chọn bị thay đổi cho đến khi phiên giao dịch được cam kết:
Db::table('users')->where('votes', '>', 100)->sharedLock()->get();
Hoặc, bạn có thể sử dụng lockForUpdate phương thức. Việc sử dụng khóa "cập nhật" có thể ngăn các hàng bị khóa chia sẻ khác thay đổi hoặc chọn:
Db::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
Gỡ lỗi
Bạn có thể sử dụng dd hoặc dump phương thức để xuất kết quả truy vấn hoặc câu lệnh SQL. Sử dụng dd phương thức sẽ hiển thị thông tin gỡ lỗi và sau đó dừng thực hiện yêu cầu. dump phương thức cũng sẽ hiển thị thông tin gỡ lỗi, nhưng sẽ không dừng thực hiện yêu cầu:
Db::table('users')->where('votes', '>', 100)->dd();
Db::table('users')->where('votes', '>', 100)->dump();
Chú ý
Gỡ lỗi cần cài đặtsymfony/var-dumper
, lệnh làcomposer require symfony/var-dumper