IT Italiano
Versione: v2.3.0

select

Recuperare i dati da una tabella.

select($table, $columns)
select($table, $columns, $where)
select($table, $join, $columns, $where)
Valore restituito
[array] Un array contenente le righe recuperate.
È possibile usare * per il parametro columns per recuperare tutte le colonne; tuttavia, per migliorare prestazioni e leggibilità, è consigliabile specificare esplicitamente solo le colonne necessarie.
$data = $database->select("account", [
	"user_name",
	"email"
], [
	"user_id[>]" => 100
]);

// Risultato di esempio:
// array(
//  [0] => array(
//	  "user_name" => "foo",
//	  "email" => "foo@bar.com"
//  ),
//  [1] => array(
//	  "user_name" => "cat",
//	  "email" => "cat@dog.com"
//  )
// )

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

// Seleziona tutte le colonne.
$data = $database->select("account", "*");

// Seleziona una singola colonna.
$data = $database->select("account", "user_name");

// Risultato di esempio:
// array(
//  [0] => "foo",
//  [1] => "cat"
// )

Recupero delle righe con callback

Per impostazione predefinita, select() carica l'intero set di risultati in memoria e lo restituisce come array.
Quando si recupera un numero elevato di righe, ciò può aumentare in modo significativo l'utilizzo della memoria. Se si passa un callback come function ($data) {} come ultimo argomento a select(), Medoo recupererà ed elaborerà immediatamente ogni riga invece di archiviare prima l'intero set di risultati in memoria.
Questo approccio è più efficiente in termini di memoria quando si lavora con set di dati di grandi dimensioni.
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

$database->select("account", [
	"name"
], function ($data) {
	echo $data["name"];
});
Benchmark delle prestazioni
L'esempio seguente confronta l'utilizzo della memoria durante il recupero e l'output di 1.000, 5.000 e 20.000 righe da un database MySQL. L'utilizzo della memoria viene misurato con memory_get_usage().
// Metodo 1
$database->select("account", ["name"], function ($data) {
	echo $data["name"];
});

// A confronto:

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

foreach ($data as $item) {
	echo $item["name"];
}
Metodo 1 Metodo 2
1.000 record 789KB 1,2 MB
5.000 record 1,1 MB 3,3 MB
20.000 record 2,26 MB 11,1 MB

Join tra tabelle

SQL Le clausole JOIN combinano righe di più tabelle. Medoo fornisce una sintassi semplice per la creazione di join.
$database->select("post", [
	// Definisce la relazione tra la tabella principale e la tabella collegata.
	"[>]account" => ["author_id" => "user_id"]
], [
	"post.title",
	"account.city"
]);
La colonna author_id nella tabella post corrisponde alla colonna user_id nella tabella account.
"[>]account" => ["author_id" => "user_id"]
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"
Se entrambe le tabelle utilizzano lo stesso nome di colonna, è possibile utilizzare la forma abbreviata.
"[>]album" => "user_id"
LEFT JOIN "album" USING ("user_id")
Se più colonne condividono gli stessi nomi in entrambe le tabelle, puoi passarle come array.
"[>]photo" => ["user_id", "avatar_id"]
LEFT JOIN "photo" USING ("user_id", "avatar_id")
Se devi unirti alla stessa tabella più di una volta, assegna un alias alla tabella unita.
"[>]account (replier)" => ["replier_id" => "user_id"]
LEFT JOIN "account" AS "replier" ON "post"."replier_id" = "replier"."user_id"
Puoi anche fare riferimento a una tabella unita in precedenza anteponendo alla colonna il nome della tabella.
"[>]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"
Condizioni JOIN multiple
"[>]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"
Condizioni JOIN aggiuntive
Puoi anche aggiungere condizioni logiche alla clausola di join.
"[>]comment" => [
	"author_id" => "user_id",
	"AND" => [
		"rate[>]" => 50
	]
]
LEFT JOIN "comment" ON "post"."author_id" = "comment"."user_id" AND "rate" > 50
JOIN con un oggetto Raw
"[>]account" => Medoo::raw("ON <post.author_id> = <account.user_id>")
LEFT JOIN "account" ON "post"."author_id" = "account"."user_id"

Mappatura dei dati

È possibile personalizzare la struttura dei dati restituiti. Non è necessario che la chiave di mappatura corrisponda al nome della colonna originale ed è supportato l'output nidificato.
$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"
			}
		}
	}
]

Mappatura per indice

Se utilizzi un nome di colonna come prima chiave nella definizione di colonna, il risultato verrà indicizzato in base a quella colonna.
$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"
	}
}

Dichiarazioni del tipo di dati

È possibile dichiarare esplicitamente il tipo di output per i campi selezionati.
// Tipi di dati supportati: [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"]
		}
	}
]
// Memorizza un oggetto nel database e recuperalo in seguito.
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;

// Il metodo __wakeup() dell'oggetto viene chiamato durante unserialize().
// Di conseguenza, l'output e "dog".

Alias

È possibile assegnare un alias al nome di una colonna o di una tabella. Ciò è particolarmente utile nelle query unite per evitare conflitti di nomi o rendere più chiaro l'output.
$data = $database->select("account", [
	"user_id",
	"nickname (my_nickname)"
]);

// Risultato di esempio:
// 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"
]);

// Risultato di esempio:
// 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

Per aggiungere la parola chiave DISTINCT a una colonna selezionata, anteporre al nome della colonna @.
$data = $database->select("account", [
	// DISTINCT verra applicato a questa colonna.
	"@location",
	
	"id",
	"name",
]);
SELECT DISTINCT "location", "id", "name"
FROM "account"
Per contare valori distinti, utilizzare un'espressione grezza.
$data = $database->select("account", [
	"unique_locations" => Medoo::raw("COUNT(DISTINCT <location>)")
]);
SELECT COUNT(DISTINCT "location") AS "unique_locations"
FROM "account"