AR العربية
الإصدار: v2.3.0

صياغة WHERE

تقبل بعض أساليب Medoo وسيطة $where لتصفية السجلات، على غرار جملة SQL WHERE. على الرغم من أن شروط SQL يمكن أن تصبح معقدة وقد تؤدي إلى مخاطر إدخال SQL عند كتابتها يدويًا، فإن 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.
$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 صفاً، ثم أعد الصفوف المئة التالية.
$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
	]
]);