Phiên bản: v2.3.0
Cú pháp WHERE
Một số phương thức của Medoo chấp nhận tham số
$where để lọc bản ghi, tương tự như mệnh đề WHERE trong SQL. Khi điều kiện trở nên phức tạp, việc tự ghép SQL có thể làm tăng nguy cơ SQL injection; Medoo cung cấp một cách có cấu trúc và an toàn hơn để xây dựng mệnh đề WHERE.Điều kiện cơ bản
Các điều kiện cơ bản rất dễ viết. Bạn cũng có thể thêm toán tử vào tên cột để tạo ra các phép so sánh nâng cao hơn, đặc biệt với các giá trị số.
$database->select("account", "user_name", [
"email" => "foo@bar.com"
]);
// WHERE email = 'foo@bar.com'
$database->select("account", "user_name", [
"user_id" => 200
]);
// WHERE user_id = 200
$database->select("account", "user_name", [
"user_id[>]" => 200
]);
// WHERE user_id > 200
$database->select("account", "user_name", [
"user_id[>=]" => 200
]);
// WHERE user_id >= 200
$database->select("account", "user_name", [
"user_id[!]" => 200
]);
// WHERE user_id != 200
$database->select("account", "user_name", [
"age[<>]" => [200, 500]
]);
// WHERE age BETWEEN 200 AND 500
$database->select("account", "user_name", [
"age[><]" => [200, 500]
]);
// WHERE age NOT BETWEEN 200 AND 500
Toán tử
[<>] và [><] cũng có thể được sử dụng với các giá trị ngày giờ.$database->select("account", "user_name", [
"birthday[<>]" => [date("Y-m-d", mktime(0, 0, 0, 1, 1, 2015)), date("Y-m-d")]
]);
$database->select("account", "user_name", [
"birthday[><]" => [date("Y-m-d", mktime(0, 0, 0, 1, 1, 2015)), date("Y-m-d")]
]);
WHERE ("birthday" BETWEEN '2015-01-01' AND '2017-01-01')
WHERE ("birthday" NOT BETWEEN '2015-01-01' AND '2017-01-01')
Bạn có thể truyền không chỉ một chuỗi hay một giá trị số mà còn cả một mảng. Trong trường hợp đó, Medoo sẽ tạo điều kiện
IN.$database->select("account", "user_name", [
"OR" => [
"user_id" => [2, 123, 234, 54],
"email" => ["foo@bar.com", "cat@dog.com", "admin@medoo.in"]
]
]);
WHERE
user_id IN (2,123,234,54) OR
email IN ('foo@bar.com','cat@dog.com','admin@medoo.in')
Điều kiện phủ định
Sử dụng toán tử [!] để xây dựng các phép so sánh phủ định như !=, NOT IN và IS NOT NULL.
$database->select("account", "user_name", [
"AND" => [
"user_name[!]" => "foo",
"user_id[!]" => 1024,
"email[!]" => ["foo@bar.com", "cat@dog.com", "admin@medoo.in"],
"city[!]" => null,
"promoted[!]" => true
]
]);
WHERE
"user_name" != 'foo' AND
"user_id" != 1024 AND
"email" NOT IN ('foo@bar.com','cat@dog.com','admin@medoo.in') AND
"city" IS NOT NULL AND
"promoted" != 1
Bạn cũng có thể sử dụng kết quả của select() hoặc get() làm giá trị của một điều kiện.
$database->select("account", "user_name", [
"user_id" => $database->select("post", "user_id", ["comments[>]" => 40])
]);
WHERE user_id IN (2, 51, 321, 3431)
Điều kiện logic
Điều kiện logic mô tả mối quan hệ giữa nhiều biểu thức. Sử dụng AND và OR để xây dựng các truy vấn phức tạp hơn.
Cách sử dụng cơ bản
$database->select("account", "user_name", [
"AND" => [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]
]);
// Theo mặc định, Medoo kết hợp các điều kiện bằng AND. Truy vấn bên dưới tương đương với cách viết này.
$database->select("account", "user_name", [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]);
WHERE user_id > 200 AND age BETWEEN 18 AND 25 AND gender = 'female'
$database->select("account", "user_name", [
"OR" => [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]
]);
WHERE user_id > 200 OR age BETWEEN 18 AND 25 OR gender = 'female'
Điều kiện lồng nhau
$database->has("account", [
"AND" => [
"OR" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"password" => "12345"
]
]);
WHERE (user_name = 'foo' OR email = 'foo@bar.com') AND password = '12345'
Vì Medoo sử dụng mảng để mô tả các điều kiện logic nên các khóa trùng lặp trong cùng một mảng sẽ ghi đè lên nhau.
// Ví dụ này sẽ không hoạt động như mong đợi.
$database->select("account", '*', [
"AND" => [
"OR" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"OR" => [
"user_name" => "bar",
"email" => "bar@foo.com"
]
]
]);
// [X] SELECT * FROM "account" WHERE ("user_name" = 'bar' OR "email" = 'bar@foo.com')
Để tránh xung đột khóa, hãy thêm chú thích sau tên khóa logic. Chú thích bắt đầu bằng
# và có thể chứa bất kỳ nội dung nào.$database->select("account", '*', [
"AND #Có thể dùng chú thích với mọi điều kiện logic AND hoặc OR" => [
"OR #điều kiện thứ nhất" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"OR #điều kiện thứ hai" => [
"user_name" => "bar",
"email" => "bar@foo.com"
]
]
]);
WHERE (
("user_name" = 'foo' OR "email" = 'foo@bar.com')
AND
("user_name" = 'bar' OR "email" = 'bar@foo.com')
)
So sánh giữa các cột
$database->select("post", [
"[>]account" => "user_id",
], [
"post.content"
], [
// So sánh các cột bằng toán tử trên tên cột đầy đủ, như [=], [>], [<] và [!=].
"post.restrict[<]account.age"
]);
WHERE "post"."restrict" < "account"."age"
Điều kiện LIKE
Sử dụng toán tử
[~] để tạo điều kiện LIKE. Nó có thể được dùng trong cả điều kiện cơ bản lẫn điều kiện logic.// Theo mặc định, từ khóa sẽ được bọc bằng % ở cả hai đầu để tìm kiếm khớp một phần.
$database->select("person", "id", [
"city[~]" => "lon"
]);
WHERE "city" LIKE '%lon%'
So khớp nhiều mẫu
$database->select("person", "id", [
"city[~]" => ["lon", "foo", "bar"]
]);
WHERE "city" LIKE '%lon%' OR "city" LIKE '%foo%' OR "city" LIKE '%bar%'
Điều kiện NOT LIKE
$database->select("person", "id", [
"city[!~]" => "lon"
]);
WHERE "city" NOT LIKE '%lon%'
Kết hợp nhiều điều kiện LIKE
$database->select("person", "id", [
"content[~]" => ["AND" => ["lon", "on"]]
]);
WHERE ("content" LIKE '%lon%' AND "content" LIKE '%on%')
$database->select("person", "id", [
"content[~]" => ["OR" => ["lon", "on"]]
]);
WHERE ("content" LIKE '%lon%' OR "content" LIKE '%on%')
Ký tự đại diện SQL
Bạn có thể sử dụng các mẫu ký tự đại diện SQL để so khớp nâng cao hơn.
$database->select("person", "id", [
"city[~]" => "%stan" // Kazakhstan, Uzbekistan, Turkmenistan
]);
$database->select("person", "id", [
"city[~]" => "Londo_" // London, Londox, Londos, ...
]);
$database->select("person", "id", [
"name[~]" => "[BCR]at" // Bat, Cat, Rat
]);
$database->select("person", "id", [
"name[~]" => "[!BCR]at" // Eat, Fat, Hat, ...
]);
Điều kiện sắp xếp
Dùng ORDER để sắp xếp kết quả.
// Sắp xếp theo một cột.
$database->select("account", "user_id", [
"ORDER" => "user_id"
]);
// Sắp xếp theo nhiều cột.
$database->select("account", "user_id", [
"ORDER" => [
// Sắp xếp một cột theo thứ tự tùy chỉnh.
"user_id" => [43, 12, 57, 98, 144, 1],
// Sắp xếp một cột theo hướng mặc định.
"register_date",
// Sắp xếp giảm dần.
"profile_id" => "DESC",
// Sắp xếp tăng dần.
"date" => "ASC"
]
]);
Tìm kiếm toàn văn
MySQL hỗ trợ tìm kiếm toàn văn cho các truy vấn tìm kiếm nâng cao hơn.
Chế độ tìm kiếm
| natural | Chế độ ngôn ngữ tự nhiên |
| natural+query | Chế độ ngôn ngữ tự nhiên có mở rộng truy vấn |
| boolean | Chế độ boolean |
| query | Có mở rộng truy vấn |
// Dieu kien MATCH.
$database->select("post_table", "post_id", [
"MATCH" => [
"columns" => ["content", "title"],
"keyword" => "foo",
// Tùy chọn: chế độ tìm kiếm.
"mode" => "natural"
]
]);
WHERE MATCH (content, title) AGAINST ('foo' IN NATURAL LANGUAGE MODE)
Biểu thức chính quy
Sử dụng toán tử [REGEXP] để khớp các giá trị với biểu thức chính quy.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'user_name[REGEXP]' => '[a-z0-9]*'
]);
WHERE "user_name" REGEXP '[a-z0-9]*'
Hàm SQL
Trong các trường hợp nâng cao, bạn có thể sử dụng hàm SQL thông qua đối tượng Raw. Xem thêm trong tài liệu raw.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'datetime' => Medoo::raw('NOW()')
]);
WHERE "datetime" = NOW()
LIMIT và OFFSET
Sử dụng LIMIT để hạn chế số lượng hàng được trả về. Bạn cũng có thể chỉ định một phần bù.
// Trả về 100 hàng đầu tiên.
$database->select("account", "user_id", [
"LIMIT" => 100
]);
// Bỏ qua 20 hàng đầu tiên, sau đó trả về 100 hàng tiếp theo.
$database->select("account", "user_id", [
"LIMIT" => [20, 100]
]);
// Với Oracle và MSSQL, bạn cũng cần ORDER BY.
$database->select("account", "user_id", [
"LIMIT" => [20, 100],
"ORDER" => "location"
]);
GROUP BY và HAVING
Sử dụng GROUP để nhóm các hàng và HAVING để lọc các kết quả được nhóm.
// Nhóm theo một cột.
$database->select("account", "user_id", [
"GROUP" => "type"
]);
// Nhóm theo nhiều cột.
$database->select("account", "user_id", [
"GROUP" => [
"type",
"age",
"gender"
]
]);
// Nhóm các hàng rồi lọc kết quả sau khi nhóm.
$database->select("account", "user_id", [
"GROUP" => "type",
"HAVING" => [
"user_id[>]" => 500
]
]);