Versione: v2.3.0
select
Recuperare i dati da una tabella.
select($table, $columns)
table [string]
Il nome della tabella da interrogare.
columns [array/string]
La colonna o le colonne da recuperare.
select($table, $columns, $where)
table [string]
Il nome della tabella da interrogare.
columns [array/string]
La colonna o le colonne da recuperare.
where [array] (facoltativo)
La clausola WHERE utilizzata per filtrare il set di risultati.
select($table, $join, $columns, $where)
table [string]
Il nome della tabella da interrogare.
join [array]
Le definizioni di JOIN utilizzate per combinare tabelle correlate. Ometti questo parametro se non è necessario alcun JOIN.
columns [array/string]
La colonna o le colonne da recuperare.
where [array] (facoltativo)
La clausola WHERE utilizzata per filtrare il set di risultati.
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.
- [>] ==> LEFT JOIN
- [<] ==> RIGHT JOIN
- [<>] ==> FULL JOIN
- [><] ==> INNER 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"