เวอร์ชัน: v2.3.0
select
ดึงข้อมูลหลายระเบียนจากตาราง
select($table, $columns)
table [string]
ชื่อตารางที่ต้องการดึงข้อมูล
columns [array/string]
คอลัมน์ที่ต้องการดึงข้อมูล
select($table, $columns, $where)
table [string]
ชื่อตารางที่ต้องการดึงข้อมูล
columns [array/string]
คอลัมน์ที่ต้องการดึงข้อมูล
where [array] (ไม่บังคับ)
เงื่อนไข WHERE สำหรับกรองผลลัพธ์
select($table, $join, $columns, $where)
table [string]
ชื่อตารางที่ต้องการดึงข้อมูล
join [array]
คำสั่ง JOIN สำหรับเชื่อมตารางที่เกี่ยวข้อง หากไม่ใช้ JOIN สามารถละพารามิเตอร์นี้ได้
columns [array/string]
คอลัมน์ที่ต้องการดึงข้อมูล
where [array] (ไม่บังคับ)
เงื่อนไข WHERE สำหรับกรองผลลัพธ์
ค่าที่ส่งกลับ
[array] อาร์เรย์ของข้อมูลที่ดึงมา
คุณสามารถใช้
* กับพารามิเตอร์ columns เพื่อดึงทุกคอลัมน์ได้ แต่เพื่อประสิทธิภาพและความอ่านง่ายที่ดีขึ้น ควรระบุเฉพาะคอลัมน์ที่จำเป็นเท่านั้น$data = $database->select("account", [
"user_name",
"email"
], [
"user_id[>]" => 100
]);
// ตัวอย่างผลลัพธ์:
// array(
// [0] => array(
// "user_name" => "foo",
// "email" => "foo@bar.com"
// ),
// [1] => array(
// "user_name" => "cat",
// "email" => "cat@dog.com"
// )
// )
foreach ($data as $item) {
echo "ผู้ใช้: " . $item["user_name"] . " - อีเมล: " . $item["email"] . "<br/>";
}
// เลือกทุกคอลัมน์
$data = $database->select("account", "*");
// เลือกเพียงคอลัมน์เดียว
$data = $database->select("account", "user_name");
// ตัวอย่างผลลัพธ์:
// array(
// [0] => "foo",
// [1] => "cat"
// )
ดึงข้อมูลทีละแถวด้วยฟังก์ชันประมวลผล
ตามค่าเริ่มต้น
select() จะโหลดผลลัพธ์ทั้งหมดเข้าสู่หน่วยความจำแล้วส่งกลับเป็นอาร์เรย์เมื่อดึงข้อมูลจำนวนมาก การใช้หน่วยความจำอาจเพิ่มขึ้นอย่างมาก หากคุณส่งฟังก์ชัน เช่น
function ($data) {} เป็นอาร์กิวเมนต์สุดท้ายให้กับ select() Medoo จะดึงและประมวลผลทีละแถวทันที แทนที่จะเก็บผลลัพธ์ทั้งหมดไว้ในหน่วยความจำก่อนแนวทางนี้มีประสิทธิภาพด้านหน่วยความจำมากกว่าเมื่อทำงานกับชุดข้อมูลขนาดใหญ่
$database->select("account", ["name"], function ($data) {
echo $data["name"];
});
$database->select("account", [
"name"
], function ($data) {
echo $data["name"];
});
เปรียบเทียบการใช้หน่วยความจำ
ตัวอย่างต่อไปนี้เปรียบเทียบการใช้หน่วยความจำเมื่อดึงและส่งออกแถว 1,000, 5,000 และ 20,000 จากฐานข้อมูล MySQL การใช้งานหน่วยความจำวัดด้วย
memory_get_usage()// วิธีที่ 1
$database->select("account", ["name"], function ($data) {
echo $data["name"];
});
// เปรียบเทียบกับ:
// วิธีที่ 2
$data = $database->select("account", ["name"]);
foreach ($data as $item) {
echo $item["name"];
}
| วิธีที่ 1 | วิธีที่ 2 | |
| 1,000 แถว | 789 กิโลไบต์ | 1.2 เมกะไบต์ |
| 5,000 แถว | 1.1 เมกะไบต์ | 3.3 เมกะไบต์ |
| 20,000 แถว | 2.26 เมกะไบต์ | 11.1 เมกะไบต์ |
การ JOIN ตาราง
ส่วนคำสั่ง JOIN ของ SQL ใช้รวมแถวจากหลายตาราง Medoo มีไวยากรณ์ที่เรียบง่ายสำหรับการเขียน JOIN
- [>] ==> LEFT JOIN
- [<] ==> RIGHT JOIN
- [<>] ==> FULL JOIN
- [><] ==> INNER JOIN
$database->select("post", [
// กำหนดความสัมพันธ์ระหว่างตารางหลักกับตารางที่นำมา JOIN
"[>]account" => ["author_id" => "user_id"]
], [
"post.title",
"account.city"
]);
คอลัมน์
author_id ในตาราง post ตรงกับคอลัมน์ user_id ในตาราง account"[>]account" => ["author_id" => "user_id"]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"
หากทั้งสองตารางใช้ชื่อคอลัมน์เดียวกัน คุณสามารถใช้แบบฟอร์มชวเลขได้
"[>]album" => "user_id"
LEFT JOIN "album" USING ("user_id")
หากหลายคอลัมน์ใช้ชื่อเดียวกันในทั้งสองตาราง คุณสามารถส่งผ่านเป็นอาร์เรย์ได้
"[>]photo" => ["user_id", "avatar_id"]
LEFT JOIN "photo" USING ("user_id", "avatar_id")
หากต้องการ JOIN ตารางเดียวกันมากกว่าหนึ่งครั้ง ให้กำหนดนามแฝงให้กับตารางที่ JOIN
"[>]account (replier)" => ["replier_id" => "user_id"]
LEFT JOIN "account" AS "replier" ON "post"."replier_id" = "replier"."user_id"
คุณยังสามารถอ้างอิงตารางที่ JOIN ไว้ก่อนหน้าได้โดยใส่ชื่อตารางนำหน้าคอลัมน์
"[>]account" => ["author_id" => "user_id"], "[>]album" => ["account.user_id" => "user_id"]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id" LEFT JOIN "album" ON "account"."user_id" = "album"."user_id"
เงื่อนไข JOIN หลายรายการ
"[>]account" => [ "author_id" => "user_id", "album.user_id" => "user_id" ]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id" AND "album"."user_id" = "account"."user_id"
เงื่อนไข JOIN เพิ่มเติม
คุณยังสามารถเพิ่มเงื่อนไขเชิงตรรกะในส่วน JOIN ได้
"[>]comment" => [ "author_id" => "user_id", "AND" => [ "rate[>]" => 50 ] ]
LEFT JOIN "comment" ON "post"."author_id" = "comment"."user_id" AND "rate" > 50
JOIN ด้วยออบเจ็กต์ Raw
"[>]account" => Medoo::raw("ON <post.author_id> = <account.user_id>")
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"
การแมปข้อมูล
คุณสามารถปรับแต่งโครงสร้างของข้อมูลที่ส่งคืนได้ คีย์การแมปไม่จำเป็นต้องตรงกับชื่อคอลัมน์ดั้งเดิม และรองรับเอาต์พุตแบบซ้อน
$data = $database->select("post", [
"[>]account" => ["user_id"]
], [
"post.content",
"userData" => [
"account.user_id",
"account.email",
"meta" => [
"account.location",
"account.gender"
]
]
], [
"LIMIT" => [0, 2]
]);
echo json_encode($data);
[
{
"content": "Hello world!",
"userData": {
"user_id": "1",
"email": "foo@example.com",
"meta": {
"location": "New York",
"gender": "male"
}
}
},
{
"content": "Hey everyone",
"userData": {
"user_id": "2",
"email": "bar@example.com",
"meta": {
"location": "London",
"gender": "female"
}
}
}
]
การแมปดัชนี
หากคุณใช้ชื่อคอลัมน์เป็นคีย์แรกในคำนิยามคอลัมน์ ผลลัพธ์จะถูกจัดทำดัชนีโดยคอลัมน์นั้น
$data = $database->select("post", [
"user_id" => [
"nickname",
"location",
"email"
]
]);
{
"10": {
"nickname": "foo",
"location": "New York",
"email": "foo@example.com"
},
"12": {
"nickname": "bar",
"location": "New York",
"email": "bar@medoo.in"
}
}
การประกาศประเภทข้อมูล
คุณสามารถประกาศประเภทเอาต์พุตสำหรับฟิลด์ที่เลือกได้อย่างชัดเจน
// ชนิดข้อมูลที่รองรับ: [String | Bool | Int | Number | Object | JSON]
// [String] เป็นชนิดเริ่มต้นของค่าที่ส่งกลับทั้งหมด
// [Object] ใช้กับข้อมูล PHP ที่ serialize() ไว้ และจะแปลงกลับด้วย unserialize()
// [JSON] ใช้กับข้อมูล JSON ที่ถูกต้อง และจะถอดรหัสด้วย json_decode()
$data = $database->select("post", [
"[>]account" => ["user_id"]
], [
"post.post_id",
"profile" => [
"account.age [Int]",
"account.is_locked [Bool]",
"account.userData [JSON]"
]
]);
echo json_encode($data);
[
{
"post_id": "1",
"profile": {
"age": 20,
"is_locked": true,
"userData": ["foo", "bar", "tim"]
}
},
{
"post_id": "2",
"profile": {
"age": 25,
"is_locked": false,
"userData": ["mydata1", "mydata2"]
}
}
]
// จัดเก็บอ็อบเจ็กต์ลงในฐานข้อมูล แล้วดึงกลับมาในภายหลัง
class Foo {
var $bar = "cat";
public function __wakeup()
{
$this->bar = "dog";
}
}
$object_data = new Foo();
$database->insert("account", [
"data" => $object_data
]);
$data = $database->select("account", [
"data [Object]"
]);
echo $data[0]["data"]->bar;
// เมทอด __wakeup() ของอ็อบเจ็กต์จะถูกเรียกระหว่าง unserialize()
// ดังนั้นผลลัพธ์ที่ได้คือ "dog"
นามแฝง
คุณสามารถกำหนดนามแฝงให้กับชื่อคอลัมน์หรือตารางได้ สิ่งนี้มีประโยชน์อย่างยิ่งในคิวรีที่มีการ JOIN เพื่อหลีกเลี่ยงความขัดแย้งของชื่อหรือทำให้ผลลัพธ์ชัดเจนยิ่งขึ้น
$data = $database->select("account", [
"user_id",
"nickname (my_nickname)"
]);
// ตัวอย่างผลลัพธ์:
// array(
// [0] => array(
// "user_id" => "1",
// "my_nickname" => "foo"
// ),
// [1] => array(
// "user_id" => "2",
// "my_nickname" => "bar"
// )
// )
$data = $database->select("post (content)", [
"[>]account (user)" => "user_id",
], [
"content.user_id (author_id)",
"user.user_id"
]);
// ตัวอย่างผลลัพธ์:
// array(
// [0] => array(
// "author_id" => "1",
// "user_id" => "321"
// ),
// [1] => array(
// "author_id" => "2",
// "user_id" => "322"
// )
// )
SELECT
"content"."user_id" AS "author_id",
"user"."user_id"
FROM
"post" AS "content"
LEFT JOIN "account" AS "user" USING ("user_id")
DISTINCT
หากต้องการเพิ่ม
DISTINCT คีย์เวิร์ดลงในคอลัมน์ที่เลือก ให้ใส่ @ นำหน้าชื่อคอลัมน์$data = $database->select("account", [
// DISTINCT จะถูกใช้กับคอลัมน์นี้
"@location",
"id",
"name",
]);
SELECT DISTINCT "location", "id", "name" FROM "account"
หากต้องการนับค่าที่ไม่ซ้ำกัน ให้ใช้
Medoo::raw()$data = $database->select("account", [
"unique_locations" => Medoo::raw("COUNT(DISTINCT <location>)")
]);
SELECT COUNT(DISTINCT "location") AS "unique_locations" FROM "account"