UK Українська
Версія: 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"
// )

Построкова обробка результатів через callback

За замовчуванням select() завантажує повний набір результатів у пам’ять і повертає його як масив.
Під час роботи з великою кількістю рядків це може суттєво збільшити використання пам’яті. Якщо передати callback, наприклад function ($data) {}, як останній аргумент до select(), Medoo одразу отримуватиме й оброблятиме кожен рядок, не зберігаючи весь набір результатів у пам’яті.
Такий підхід особливо доречний для великих наборів даних.
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

$database->select("account", [
	"name"
], function ($data) {
	echo $data["name"];
});
Порівняння продуктивності
У наступному прикладі порівнюється використання пам’яті під час отримання та виведення 1000, 5000 і 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
1000 записів 789 КБ 1,2 МБ
5000 записів 1,1 МБ 3,3 МБ
20 000 записів 2,26 Мб 11,1 МБ

Об'єднання таблиць

JOIN-клаузи SQL поєднують рядки з кількох таблиць. 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
Ви також можете додати логічні умови до клаузи 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".

Псевдоніми

Ви можете призначити псевдонім імені стовпця або таблиці. Це особливо корисно в об’єднаних запитах, щоб уникнути конфліктів імен або зробити вивід більш чітким.
$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"
Щоб підрахувати різні значення, використовуйте Raw SQL-вираз.
$data = $database->select("account", [
	"unique_locations" => Medoo::raw("COUNT(DISTINCT <location>)")
]);
SELECT COUNT(DISTINCT "location") AS "unique_locations"
FROM "account"