ES Español
Versión: v2.3.0

select

Recuperar datos de una tabla.

select($table, $columns)
select($table, $columns, $where)
select($table, $join, $columns, $where)
Valor devuelto
[array] Un arreglo que contiene las filas recuperadas.
Puede usar * en el parámetro columns para recuperar todas las columnas; sin embargo, por rendimiento y legibilidad, se recomienda especificar solo las columnas necesarias.
$data = $database->select("account", [
	"user_name",
	"email"
], [
	"user_id[>]" => 100
]);

// Resultado de ejemplo:
// array(
//  [0] => array(
//	  "user_name" => "foo",
//	  "email" => "foo@bar.com"
//  ),
//  [1] => array(
//	  "user_name" => "cat",
//	  "email" => "cat@dog.com"
//  )
// )

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

// Selecciona todas las columnas.
$data = $database->select("account", "*");

// Selecciona una sola columna.
$data = $database->select("account", "user_name");

// Resultado de ejemplo:
// array(
//  [0] => "foo",
//  [1] => "cat"
// )

Obtener filas con un callback

De forma predeterminada, select() carga el conjunto de resultados completo en la memoria y lo devuelve como una matriz.
Al recuperar una gran cantidad de filas, esto puede aumentar significativamente el uso de memoria. Si pasa una devolución de llamada como function ($data) {} como último argumento a select(), Medoo buscará y procesará cada fila inmediatamente en lugar de almacenar primero todo el conjunto de resultados en la memoria.
Este enfoque consume menos memoria cuando se trabaja con grandes conjuntos de datos.
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

$database->select("account", [
	"name"
], function ($data) {
	echo $data["name"];
});
Comparativa de rendimiento
El siguiente ejemplo compara el uso de memoria al recuperar y generar 1000, 5000 y 20 000 filas de una base de datos MySQL. El uso de la memoria se mide con memory_get_usage().
// Método 1
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

// Comparado con:

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

foreach ($data as $item) {
	echo $item["name"];
}
Método 1 Método 2
1000 registros 789KB 1,2 MB
5000 registros 1,1 MB 3,3 MB
20.000 registros 2,26 MB 11,1 MB

Uniones de tablas

Las cláusulas SQL JOIN combinan filas de varias tablas. Medoo proporciona una sintaxis sencilla para crear uniones.
$database->select("post", [
	// Define la relación entre la tabla principal y la tabla unida.
	"[>]account" => ["author_id" => "user_id"]
], [
	"post.title",
	"account.city"
]);
La columna author_id de la tabla post coincide con la columna user_id de la tabla account.
"[>]account" => ["author_id" => "user_id"]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"
Si ambas tablas usan el mismo nombre de columna, puede usar la forma abreviada.
"[>]album" => "user_id"
LEFT JOIN "album" USING ("user_id")
Si varias columnas comparten los mismos nombres en ambas tablas, puede pasarlas como una matriz.
"[>]photo" => ["user_id", "avatar_id"]
LEFT JOIN "photo" USING ("user_id", "avatar_id")
Si necesita unirse a la misma tabla más de una vez, asigne un alias a la tabla unida.
"[>]account (replier)" => ["replier_id" => "user_id"]
LEFT JOIN "account" AS "replier" ON "post"."replier_id" = "replier"."user_id"
También puede hacer referencia a una tabla previamente unida anteponiendo a la columna el nombre de la tabla.
"[>]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"
Múltiples condiciones de 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"
Condiciones adicionales de JOIN
También puede agregar condiciones lógicas a la cláusula de unión.
"[>]comment" => [
	"author_id" => "user_id",
	"AND" => [
		"rate[>]" => 50
	]
]
LEFT JOIN "comment" ON "post"."author_id" = "comment"."user_id" AND "rate" > 50
JOIN con un objeto Raw
"[>]account" => Medoo::raw("ON <post.author_id> = <account.user_id>")
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"

Mapeo de datos

Puede personalizar la estructura de los datos devueltos. No es necesario que la clave de asignación coincida con el nombre de la columna original y se admite la salida anidada.
$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"
			}
		}
	}
]

Mapeo por indice

Si utiliza un nombre de columna como primera clave en la definición de la columna, el resultado será indexado por esa columna.
$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"
	}
}

Declaraciones de tipos de datos

Puede declarar explícitamente el tipo de salida para los campos seleccionados.
// Tipos de datos admitidos: [String | Bool | Int | Number | Object | JSON]
// [String] es el tipo predeterminado para todos los valores de salida.
// [Object] representa datos de PHP serializados con serialize() y restaurados con unserialize().
// [JSON] representa datos JSON validos y se decodificara con 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"]
		}
	}
]
// Guarda un objeto en la base de datos y recupéralo después.
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;

// El método __wakeup() del objeto se llama durante unserialize().
// Por eso, la salida es "dog".

Alias

Puede asignar un alias al nombre de una columna o tabla. Esto es especialmente útil en consultas unidas para evitar conflictos de nombres o hacer que el resultado sea más claro.
$data = $database->select("account", [
	"user_id",
	"nickname (my_nickname)"
]);

// Resultado de ejemplo:
// 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"
]);

// Resultado de ejemplo:
// 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

Para agregar la palabra clave DISTINCT a una columna seleccionada, anteponga el nombre de la columna con @.
$data = $database->select("account", [
	// DISTINCT se aplicará a esta columna.
	"@location",
	
	"id",
	"name",
]);
SELECT DISTINCT "location", "id", "name"
FROM "account"
Para contar valores distintos, utilice una expresión sin formato.
$data = $database->select("account", [
	"unique_locations" => Medoo::raw("COUNT(DISTINCT <location>)")
]);
SELECT COUNT(DISTINCT "location") AS "unique_locations"
FROM "account"