TH ไทย
เวอร์ชัน: v2.3.0

ไวยากรณ์ WHERE

หลายเมธอดของ Medoo รองรับพารามิเตอร์ $where สำหรับกรองข้อมูล โดยแนวคิดจะใกล้เคียงกับส่วนคำสั่ง WHERE ของ SQL แม้การเขียนเงื่อนไข SQL เองอาจซับซ้อนและเสี่ยงต่อการโจมตีแบบ SQL injection แต่ Medoo มีรูปแบบที่ชัดเจนและปลอดภัยกว่าสำหรับประกอบเงื่อนไข WHERE

เงื่อนไขพื้นฐาน

เงื่อนไขพื้นฐานใช้งานได้ตรงไปตรงมา คุณยังสามารถเพิ่มตัวดำเนินการต่อท้ายชื่อคอลัมน์เพื่อสร้างการเปรียบเทียบขั้นสูงขึ้นได้ โดยเฉพาะค่าตัวเลข
$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
ตัวดำเนินการ [<>] และ [><] สามารถใช้กับค่าวันที่และเวลาได้เช่นกัน
$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')
คุณสามารถส่งผ่านได้ไม่เพียงแต่สตริงหรือค่าตัวเลขเดียวเท่านั้น แต่ยังส่งผ่านอาร์เรย์ได้ด้วย ในกรณีนั้น Medoo จะสร้างเงื่อนไข 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')

เงื่อนไขเชิงลบ

ใช้ตัวดำเนินการ [!] เพื่อสร้างการเปรียบเทียบเชิงลบ เช่น !=, NOT IN และ 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
คุณยังสามารถใช้ผลลัพธ์ของ select() หรือ get() เป็นค่าของเงื่อนไขได้
$database->select("account", "user_name", [
	"user_id" => $database->select("post", "user_id", ["comments[>]" => 40])
]);
WHERE user_id IN (2, 51, 321, 3431)

เงื่อนไขเชิงตรรกะ

เงื่อนไขทางตรรกะใช้อธิบายความสัมพันธ์ระหว่างหลายนิพจน์ ใช้ AND และ OR เพื่อสร้างคิวรีที่ซับซ้อนมากขึ้น
การใช้งานขั้นพื้นฐาน
$database->select("account", "user_name", [
	"AND" => [
		"user_id[>]" => 200,
		"age[<>]" => [18, 25],
		"gender" => "female"
	]
]);

// โดยค่าเริ่มต้น Medoo จะรวมเงื่อนไขด้วย AND และคิวรีด้านล่างมีความหมายเทียบเท่ากัน
$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'
เงื่อนไขที่ซ้อนกัน
$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'

เนื่องจาก Medoo ใช้อาร์เรย์เพื่ออธิบายเงื่อนไขเชิงตรรกะ คีย์ที่ซ้ำกันในอาร์เรย์เดียวกันจะเขียนทับซึ่งกันและกัน

// ตัวอย่างนี้จะไม่ทำงานตามที่คาดไว้
$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')
เพื่อหลีกเลี่ยงการชนกันของคีย์ ให้เพิ่มคอมเมนต์ต่อท้ายชื่อโลจิคัลคีย์ คอมเมนต์จะขึ้นต้นด้วย # และสามารถใส่ข้อความใดก็ได้
$database->select("account", '*', [
	"AND #สามารถใส่คอมเมนต์กับเงื่อนไขเชิงตรรกะ AND หรือ OR ได้" => [
		"OR #เงื่อนไขแรก" => [
			"user_name" => "foo",
			"email" => "foo@bar.com"
		],
		"OR #เงื่อนไขที่สอง" => [
			"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')
)
การเปรียบเทียบคอลัมน์
$database->select("post", [
	"[>]account" => "user_id",
], [
	"post.content"
], [
	// เปรียบเทียบคอลัมน์ด้วยโอเปอเรเตอร์บนชื่อคอลัมน์แบบระบุเต็ม เช่น [=], [>], [<] และ [!=]
	"post.restrict[<]account.age"
]);
WHERE "post"."restrict" < "account"."age"

เงื่อนไข LIKE

ใช้ตัวดำเนินการ [~] เพื่อสร้างเงื่อนไข LIKE สามารถใช้ได้ทั้งในสภาวะพื้นฐานและเชิงตรรกะ
// โดยปกติจะครอบคีย์เวิร์ดด้วย % ทั้งสองด้านเพื่อให้ค้นหาแบบตรงบางส่วน
$database->select("person", "id", [
	"city[~]" => "lon"
]);
WHERE "city" LIKE '%lon%'
การจับคู่กลุ่ม
$database->select("person", "id", [
	"city[~]" => ["lon", "foo", "bar"]
]);
WHERE "city" LIKE '%lon%' OR "city" LIKE '%foo%' OR "city" LIKE '%bar%'
เงื่อนไข LIKE เชิงลบ
$database->select("person", "id", [
	"city[!~]" => "lon"
]);
WHERE "city" NOT LIKE '%lon%'
เงื่อนไข 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%')
SQL ไวด์การ์ด
คุณสามารถใช้ไวลด์การ์ดของ SQL เพื่อการจับคู่ที่ซับซ้อนยิ่งขึ้น
$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, ...
]);

เงื่อนไขการจัดเรียง

ใช้ ORDER เพื่อเรียงลำดับชุดผลลัพธ์
// เรียงลำดับตามคอลัมน์เดียว
$database->select("account", "user_id", [
	"ORDER" => "user_id"
]);

// เรียงลำดับตามหลายคอลัมน์
$database->select("account", "user_id", [
	"ORDER" => [
		// เรียงคอลัมน์ด้วยลำดับที่กำหนดเอง
		"user_id" => [43, 12, 57, 98, 144, 1],

		// เรียงคอลัมน์ด้วยทิศทางเริ่มต้น
		"register_date",

		// เรียงจากมากไปน้อย
		"profile_id" => "DESC",

		// เรียงจากน้อยไปมาก
		"date" => "ASC"
	]
]);

ค้นหาข้อความแบบเต็ม

MySQL รองรับการค้นหาข้อความแบบเต็มสำหรับคำค้นหาขั้นสูงเพิ่มเติม
โหมดการค้นหา
natural ในโหมดภาษาธรรมชาติ
natural+query ในโหมดภาษาธรรมชาติพร้อมส่วนขยายคำถาม
boolean ในโหมดบูลีน
query พร้อมส่วนขยายการค้นหา
// เงื่อนไข MATCH
$database->select("post_table", "post_id", [
	"MATCH" => [
		"columns" => ["content", "title"],
		"keyword" => "foo",

		// ไม่บังคับ: โหมดการค้นหา
		"mode" => "natural"
	]
]);
WHERE MATCH (content, title) AGAINST ('foo' IN NATURAL LANGUAGE MODE)

นิพจน์ทั่วไป

ใช้โอเปอเรเตอร์ [REGEXP] เพื่อจับคู่ค่ากับนิพจน์ทั่วไป
$data = $database->select('account', [
	'user_id',
	'user_name'
], [
	'user_name[REGEXP]' => '[a-z0-9]*'
]);
WHERE "user_name" REGEXP '[a-z0-9]*'

ฟังก์ชัน SQL

ในกรณีที่ซับซ้อนยิ่งขึ้น คุณสามารถใช้ฟังก์ชัน SQL ผ่านออบเจ็กต์ Raw ได้ อ่านเพิ่มเติมได้ในเอกสาร raw
$data = $database->select('account', [
	'user_id',
	'user_name'
], [
	'datetime' => Medoo::raw('NOW()')
]);
WHERE "datetime" = NOW()

LIMIT และ OFFSET

ใช้ LIMIT เพื่อจำกัดจำนวนแถวที่ส่งคืน คุณยังสามารถระบุออฟเซ็ตได้
// คืนค่า 100 แถวแรก
$database->select("account", "user_id", [
	"LIMIT" => 100
]);

// ข้าม 20 แถวแรก แล้วคืนค่าอีก 100 แถวถัดไป
$database->select("account", "user_id", [
	"LIMIT" => [20, 100]
]);

// สำหรับ Oracle และ MSSQL จำเป็นต้องมี ORDER BY ด้วย
$database->select("account", "user_id", [
	"LIMIT" => [20, 100],
	"ORDER" => "location"
]);

GROUP BY และ HAVING

ใช้ GROUP เพื่อจัดกลุ่มแถว และใช้ HAVING เพื่อกรองผลลัพธ์หลังการจัดกลุ่ม
// จัดกลุ่มตามคอลัมน์เดียว
$database->select("account", "user_id", [
	"GROUP" => "type"
]);

// จัดกลุ่มตามหลายคอลัมน์
$database->select("account", "user_id", [
	"GROUP" => [
		"type",
		"age",
		"gender"
	]
]);

// จัดกลุ่มแถวและกรองผลลัพธ์หลังการจัดกลุ่ม
$database->select("account", "user_id", [
	"GROUP" => "type",
	"HAVING" => [
		"user_id[>]" => 500
	]
]);