FR Français
Version: v2.3.0

select

Récupérer les données d'une table.

select($table, $columns)
select($table, $columns, $where)
select($table, $join, $columns, $where)
Valeur de retour
[array] Un tableau contenant les lignes récupérées.
Vous pouvez utiliser * pour le paramètre columns afin de récupérer toutes les colonnes ; toutefois, pour de meilleures performances et une meilleure lisibilité, il est recommandé de ne sélectionner explicitement que les colonnes nécessaires.
$data = $database->select("account", [
	"user_name",
	"email"
], [
	"user_id[>]" => 100
]);

// Exemple de résultat :
// array(
//  [0] => array(
//	  "user_name" => "foo",
//	  "email" => "foo@bar.com"
//  ),
//  [1] => array(
//	  "user_name" => "cat",
//	  "email" => "cat@dog.com"
//  )
// )

foreach ($data as $item) {
	echo "Utilisateur : " . $item["user_name"] . " - E-mail : " . $item["email"] . "<br/>";
}

// Sélectionner toutes les colonnes.
$data = $database->select("account", "*");

// Sélectionner une seule colonne.
$data = $database->select("account", "user_name");

// Exemple de résultat :
// array(
//  [0] => "foo",
//  [1] => "cat"
// )

Récupération ligne par ligne avec une fonction de rappel

Par défaut, select() charge le jeu de résultats complet en mémoire et le renvoie sous forme de tableau.
Lors de la récupération d'un grand nombre de lignes, cela peut augmenter considérablement l'utilisation de la mémoire. Si vous transmettez un rappel tel que function ($data) {} comme dernier argument à select(), Medoo récupérera et traitera chaque ligne immédiatement au lieu de stocker d'abord l'ensemble des résultats en mémoire.
Cette approche est plus efficace en termes de mémoire lorsque vous travaillez avec de grands ensembles de données.
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

$database->select("account", [
	"name"
], function ($data) {
	echo $data["name"];
});
Comparatif de performances
L'exemple suivant compare l'utilisation de la mémoire lors de la récupération et de la sortie de 1 000, 5 000 et 20 000 lignes à partir d'une base de données MySQL. L'utilisation de la mémoire est mesurée avec memory_get_usage().
// Méthode 1
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

// À comparer avec :

// Méthode 2
$data = $database->select("account", ["name"]);

foreach ($data as $item) {
	echo $item["name"];
}
Méthode 1 Méthode 2
1 000 enregistrements 789 Ko 1,2 Mo
5 000 enregistrements 1,1 Mo 3,3 Mo
20 000 enregistrements 2,26 Mo 11,1 Mo

Jointures de tables

Les clauses SQL JOIN combinent des lignes issues de plusieurs tables. Medoo fournit une syntaxe simple pour créer ces jointures.
$database->select("post", [
	// Définit la relation entre la table principale et la table jointe.
	"[>]account" => ["author_id" => "user_id"]
], [
	"post.title",
	"account.city"
]);
La colonne author_id de la table post correspond à la colonne user_id de la table account.
"[>]account" => ["author_id" => "user_id"]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"
Si les deux tables utilisent le même nom de colonne, vous pouvez utiliser la forme abrégée.
"[>]album" => "user_id"
LEFT JOIN "album" USING ("user_id")
Si plusieurs colonnes partagent les mêmes noms dans les deux tables, vous pouvez les transmettre sous forme de tableau.
"[>]photo" => ["user_id", "avatar_id"]
LEFT JOIN "photo" USING ("user_id", "avatar_id")
Si vous devez rejoindre la même table plusieurs fois, attribuez un alias à la table jointe.
"[>]account (replier)" => ["replier_id" => "user_id"]
LEFT JOIN "account" AS "replier" ON "post"."replier_id" = "replier"."user_id"
Vous pouvez également référencer une table précédemment jointe en préfixant la colonne avec le nom de la table.
"[>]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"
Conditions de JOIN multiples
"[>]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"
Conditions de JOIN supplémentaires
Vous pouvez également ajouter des conditions logiques à la clause de jointure.
"[>]comment" => [
	"author_id" => "user_id",
	"AND" => [
		"rate[>]" => 50
	]
]
LEFT JOIN "comment" ON "post"."author_id" = "comment"."user_id" AND "rate" > 50
Jointure avec un objet Raw
"[>]account" => Medoo::raw("ON <post.author_id> = <account.user_id>")
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"

Mappage des données

Vous pouvez personnaliser la structure des données renvoyées. La clé de mappage n'a pas besoin de correspondre au nom de colonne d'origine et la sortie imbriquée est prise en charge.
$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"
			}
		}
	}
]

Mappage par index

Si vous utilisez un nom de colonne comme première clé dans la définition de colonne, le résultat sera indexé par cette colonne.
$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"
	}
}

Déclarations de types de données

Vous pouvez déclarer explicitement le type de sortie pour les champs sélectionnés.
// Types de données pris en charge : [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"]
		}
	}
]
// Stockez un objet dans la base de données, puis récupérez-le plus tard.
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;

// La methode __wakeup() de l'objet est appelee pendant unserialize().
// La sortie est donc "dog".

Alias

Vous pouvez attribuer un alias à un nom de colonne ou de table. Ceci est particulièrement utile dans les requêtes jointes pour éviter les conflits de noms ou rendre le résultat plus clair.
$data = $database->select("account", [
	"user_id",
	"nickname (my_nickname)"
]);

// Exemple de résultat :
// 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"
]);

// Exemple de résultat :
// 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

Pour ajouter le mot-clé DISTINCT à une colonne sélectionnée, préfixez le nom de la colonne avec @.
$data = $database->select("account", [
	// DISTINCT sera applique a cette colonne.
	"@location",
	
	"id",
	"name",
]);
SELECT DISTINCT "location", "id", "name"
FROM "account"
Pour compter des valeurs distinctes, utilisez une expression brute.
$data = $database->select("account", [
	"unique_locations" => Medoo::raw("COUNT(DISTINCT <location>)")
]);
SELECT COUNT(DISTINCT "location") AS "unique_locations"
FROM "account"