Versione: v2.3.0
Sintassi WHERE
Alcuni metodi Medoo accettano un argomento
$where per filtrare i record, simile alla clausola SQL WHERE. Sebbene le condizioni SQL possano diventare complesse e introdurre rischi di iniezione SQL se scritte manualmente, Medoo fornisce un modo strutturato ed espressivo per creare clausole WHERE in modo sicuro.Condizioni di base
Le condizioni di base sono semplici da usare. Puoi anche aggiungere operatori al nome di una colonna per creare confronti più avanzati, soprattutto per i valori numerici.
$database->select("account", "user_name", [
"email" => "foo@bar.com"
]);
// WHERE email = 'foo@bar.com'
$database->select("account", "user_name", [
"user_id" => 200
]);
// WHERE user_id = 200
$database->select("account", "user_name", [
"user_id[>]" => 200
]);
// WHERE user_id > 200
$database->select("account", "user_name", [
"user_id[>=]" => 200
]);
// WHERE user_id >= 200
$database->select("account", "user_name", [
"user_id[!]" => 200
]);
// WHERE user_id != 200
$database->select("account", "user_name", [
"age[<>]" => [200, 500]
]);
// WHERE age BETWEEN 200 AND 500
$database->select("account", "user_name", [
"age[><]" => [200, 500]
]);
// WHERE age NOT BETWEEN 200 AND 500
Gli operatori
[<>] e [><] possono essere utilizzati anche con valori data/ora.$database->select("account", "user_name", [
"birthday[<>]" => [date("Y-m-d", mktime(0, 0, 0, 1, 1, 2015)), date("Y-m-d")]
]);
$database->select("account", "user_name", [
"birthday[><]" => [date("Y-m-d", mktime(0, 0, 0, 1, 1, 2015)), date("Y-m-d")]
]);
WHERE ("birthday" BETWEEN '2015-01-01' AND '2017-01-01')
WHERE ("birthday" NOT BETWEEN '2015-01-01' AND '2017-01-01')
Puoi passare non solo una singola stringa o un valore numerico, ma anche un array. In tal caso, Medoo genera una condizione IN.
$database->select("account", "user_name", [
"OR" => [
"user_id" => [2, 123, 234, 54],
"email" => ["foo@bar.com", "cat@dog.com", "admin@medoo.in"]
]
]);
WHERE
user_id IN (2,123,234,54) OR
email IN ('foo@bar.com','cat@dog.com','admin@medoo.in')
Condizioni negative
Utilizzare l'operatore [!] per creare confronti negativi come !=, NOT IN e IS NOT NULL.
$database->select("account", "user_name", [
"AND" => [
"user_name[!]" => "foo",
"user_id[!]" => 1024,
"email[!]" => ["foo@bar.com", "cat@dog.com", "admin@medoo.in"],
"city[!]" => null,
"promoted[!]" => true
]
]);
WHERE
"user_name" != 'foo' AND
"user_id" != 1024 AND
"email" NOT IN ('foo@bar.com','cat@dog.com','admin@medoo.in') AND
"city" IS NOT NULL AND
"promoted" != 1
Puoi anche utilizzare il risultato di select() o get() come valore di una condizione.
$database->select("account", "user_name", [
"user_id" => $database->select("post", "user_id", ["comments[>]" => 40])
]);
WHERE user_id IN (2, 51, 321, 3431)
Condizioni logiche
Le condizioni logiche descrivono le relazioni tra più espressioni. Utilizza AND e OR per creare query più complesse.
Utilizzo di base
$database->select("account", "user_name", [
"AND" => [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]
]);
// Per impostazione predefinita, Medoo combina le condizioni con AND. La query seguente e equivalente.
$database->select("account", "user_name", [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]);
WHERE user_id > 200 AND age BETWEEN 18 AND 25 AND gender = 'female'
$database->select("account", "user_name", [
"OR" => [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]
]);
WHERE user_id > 200 OR age BETWEEN 18 AND 25 OR gender = 'female'
Condizioni nidificate
$database->has("account", [
"AND" => [
"OR" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"password" => "12345"
]
]);
WHERE (user_name = 'foo' OR email = 'foo@bar.com') AND password = '12345'
Poiché Medoo utilizza gli array per descrivere le condizioni logiche, le chiavi duplicate nello stesso array si sovrascriveranno a vicenda.
// Questo non funzionera come previsto.
$database->select("account", '*', [
"AND" => [
"OR" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"OR" => [
"user_name" => "bar",
"email" => "bar@foo.com"
]
]
]);
// [X] SELECT * FROM "account" WHERE ("user_name" = 'bar' OR "email" = 'bar@foo.com')
Per evitare collisioni tra tasti, aggiungi un commento dopo il nome della chiave logica. Il commento inizia con # e può contenere qualsiasi testo.
$database->select("account", '*', [
"AND #I commenti possono essere usati con qualsiasi condizione logica AND o OR" => [
"OR #prima condizione" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"OR #seconda condizione" => [
"user_name" => "bar",
"email" => "bar@foo.com"
]
]
]);
WHERE (
("user_name" = 'foo' OR "email" = 'foo@bar.com')
AND
("user_name" = 'bar' OR "email" = 'bar@foo.com')
)
Relazioni tra colonne
$database->select("post", [
"[>]account" => "user_id",
], [
"post.content"
], [
// Confronta le colonne con operatori su nomi di colonna pienamente qualificati, come [=], [>], [<] e [!=].
"post.restrict[<]account.age"
]);
WHERE "post"."restrict" < "account"."age"
Condizioni LIKE
Utilizza l'operatore
[~] per creare condizioni LIKE. Può essere utilizzato sia in condizioni di base che logiche.// Per impostazione predefinita, la parola chiave viene racchiusa da % su entrambi i lati per una corrispondenza parziale.
$database->select("person", "id", [
"city[~]" => "lon"
]);
WHERE "city" LIKE '%lon%'
Abbinamento di gruppo
$database->select("person", "id", [
"city[~]" => ["lon", "foo", "bar"]
]);
WHERE "city" LIKE '%lon%' OR "city" LIKE '%foo%' OR "city" LIKE '%bar%'
Condizioni LIKE negative
$database->select("person", "id", [
"city[!~]" => "lon"
]);
WHERE "city" NOT LIKE '%lon%'
Condizioni LIKE composte
$database->select("person", "id", [
"content[~]" => ["AND" => ["lon", "on"]]
]);
WHERE ("content" LIKE '%lon%' AND "content" LIKE '%on%')
$database->select("person", "id", [
"content[~]" => ["OR" => ["lon", "on"]]
]);
WHERE ("content" LIKE '%lon%' OR "content" LIKE '%on%')
SQL Caratteri jolly
È possibile utilizzare i modelli di caratteri jolly SQL per corrispondenze più avanzate.
$database->select("person", "id", [
"city[~]" => "%stan" // Kazakhstan, Uzbekistan, Turkmenistan
]);
$database->select("person", "id", [
"city[~]" => "Londo_" // London, Londox, Londos, ...
]);
$database->select("person", "id", [
"name[~]" => "[BCR]at" // Bat, Cat, Rat
]);
$database->select("person", "id", [
"name[~]" => "[!BCR]at" // Eat, Fat, Hat, ...
]);
Condizioni di ordinamento
Utilizzare ORDER per ordinare il set di risultati.
// Ordina per una sola colonna.
$database->select("account", "user_id", [
"ORDER" => "user_id"
]);
// Ordina per piu colonne.
$database->select("account", "user_id", [
"ORDER" => [
// Ordina una colonna con un ordine personalizzato.
"user_id" => [43, 12, 57, 98, 144, 1],
// Ordina una colonna usando la direzione predefinita.
"register_date",
// Ordina in modo decrescente.
"profile_id" => "DESC",
// Ordina in modo crescente.
"date" => "ASC"
]
]);
Ricerca nel testo completo
La ricerca full-text è supportata da MySQL per query di ricerca più avanzate.
Modalità di ricerca
| natural | IN MODALITÀ LINGUA NATURALE |
| natural+query | IN MODALITÀ LINGUA NATURALE CON ESPANSIONE DELLA QUERY |
| boolean | IN MODALITÀ BOOLEAN |
| query | CON ESPANSIONE DELLA QUERY |
// Condizione MATCH.
$database->select("post_table", "post_id", [
"MATCH" => [
"columns" => ["content", "title"],
"keyword" => "foo",
// Facoltativo: modalita di ricerca.
"mode" => "natural"
]
]);
WHERE MATCH (content, title) AGAINST ('foo' IN NATURAL LANGUAGE MODE)
Espressioni regolari
Utilizzare l'operatore [REGEXP] per abbinare i valori con un'espressione regolare.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'user_name[REGEXP]' => '[a-z0-9]*'
]);
WHERE "user_name" REGEXP '[a-z0-9]*'
Funzioni SQL
Per i casi avanzati, puoi usare le funzioni SQL tramite l’oggetto raw. Per maggiori dettagli, consulta la documentazione raw.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'datetime' => Medoo::raw('NOW()')
]);
WHERE "datetime" = NOW()
LIMIT e OFFSET
Utilizzare LIMIT per limitare il numero di righe restituite. È inoltre possibile specificare un offset.
// Restituisce le prime 100 righe.
$database->select("account", "user_id", [
"LIMIT" => 100
]);
// Salta le prime 20 righe e restituisce le 100 successive.
$database->select("account", "user_id", [
"LIMIT" => [20, 100]
]);
// Per Oracle e MSSQL e richiesto anche ORDER BY.
$database->select("account", "user_id", [
"LIMIT" => [20, 100],
"ORDER" => "location"
]);
GROUP BY e HAVING
Utilizza GRUPPO per raggruppare le righe e HAVING per filtrare i risultati raggruppati.
// Raggruppa per una sola colonna.
$database->select("account", "user_id", [
"GROUP" => "type"
]);
// Raggruppa per piu colonne.
$database->select("account", "user_id", [
"GROUP" => [
"type",
"age",
"gender"
]
]);
// Raggruppa le righe e filtra il risultato raggruppato.
$database->select("account", "user_id", [
"GROUP" => "type",
"HAVING" => [
"user_id[>]" => 500
]
]);