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

select

استرجاع البيانات من جدول.

select($table, $columns)
select($table, $columns, $where)
select($table, $join, $columns, $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"];
});
مقارنة الأداء
يقارن المثال التالي استخدام الذاكرة عند جلب وإخراج 1000 و5000 و20000 صف من قاعدة بيانات 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"];
}
الطريقة الأولى الطريقة الثانية
1000 صف 789 كيلو بايت 1.2 ميجابايت
5000 صف 1.1 ميجابايت 3.3 ميجابايت
20,000 صف 2.26 ميجابايت 11.1 ميجابايت

ربط الجداول

تجمع عبارات SQL JOIN صفوفًا من جداول متعددة. يوفّر Medoo بناء جملة بسيطًا لبناء عمليات الربط.
$database->select("post", [
	// حدِّد العلاقة بين الجدول الرئيسي والجدول المنضم.
	"[>]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")
إذا كنت بحاجة إلى الانضمام إلى نفس الجدول أكثر من مرة، فقم بتعيين اسم مستعار للجدول المرتبط.
"[>]account (replier)" => ["replier_id" => "user_id"]
LEFT JOIN "account" AS "replier" ON "post"."replier_id" = "replier"."user_id"
يمكنك أيضًا الإشارة إلى جدول تم ربطه مسبقًا عن طريق وضع بادئة للعمود باسم الجدول.
"[>]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 إضافية
يمكنك أيضًا إضافة شروط منطقية إلى جملة الانضمام.
"[>]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] is the default type for all output values.
// [Object] represents PHP data serialized with serialize() and decoded with unserialize().
// [JSON] represents valid JSON data and will be decoded with 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".

الأسماء المستعارة

يمكنك تعيين اسم مستعار لاسم عمود أو جدول. يعد هذا مفيدًا بشكل خاص في الاستعلامات المرتبطة لتجنب تعارض الأسماء أو جعل الإخراج أكثر وضوحًا.
$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"
لحساب القيم المميزة، استخدم تعبيرًا أوليًا.
$data = $database->select("account", [
	"unique_locations" => Medoo::raw("COUNT(DISTINCT <location>)")
]);
SELECT COUNT(DISTINCT "location") AS "unique_locations"
FROM "account"