Versión: v2.3.0
Sintaxis de WHERE
Algunos métodos Medoo aceptan un argumento
$where para filtrar registros, similar a la cláusula SQL WHERE. Aunque las condiciones SQL pueden volverse complejas y pueden introducir riesgos de inyección de SQL cuando se escriben manualmente, Medoo proporciona una forma estructurada y expresiva de crear cláusulas WHERE de forma segura.Condiciones Básicas
Las condiciones básicas son fáciles de usar. También puede agregar operadores al nombre de una columna para crear comparaciones más avanzadas, especialmente para valores numéricos.
$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
Los operadores
[<>] y [><] también se pueden utilizar con valores de fecha y hora.$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')
Puede pasar no solo una única cadena o valor numérico, sino también una matriz. En ese caso, Medoo genera una condición 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')
Condiciones negativas
Utilice el operador [!] para crear comparaciones negativas como !=, NOT IN y NOT IS 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
También puede utilizar el resultado de select() o get() como valor de una condición.
$database->select("account", "user_name", [
"user_id" => $database->select("post", "user_id", ["comments[>]" => 40])
]);
WHERE user_id IN (2, 51, 321, 3431)
Condiciones lógicas
Las condiciones lógicas describen relaciones entre múltiples expresiones. Utilice AND y OR para crear consultas más complejas.
Uso básico
$database->select("account", "user_name", [
"AND" => [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]
]);
// Medoo combina las condiciones con AND de forma predeterminada. La consulta siguiente es 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'
Condiciones anidadas
$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'
Debido a que Medoo usa matrices para describir condiciones lógicas, las claves duplicadas en la misma matriz se sobrescribirán entre sí.
// Esto no funcionará como esperas.
$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')
Para evitar colisiones de claves, agregue un comentario después del nombre de la clave lógica. El comentario comienza con # y puede contener cualquier texto.
$database->select("account", '*', [
"AND #Los comentarios pueden usarse con cualquier condición lógica AND u OR" => [
"OR #primera condición" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"OR #segunda condición" => [
"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')
)
Relaciones de columnas
$database->select("post", [
"[>]account" => "user_id",
], [
"post.content"
], [
// Compara columnas con operadores sobre nombres de columna totalmente calificados, como [=], [>], [<] y [!=].
"post.restrict[<]account.age"
]);
WHERE "post"."restrict" < "account"."age"
Condiciones LIKE
Utilice el operador
[~] para crear condiciones LIKE. Se puede utilizar tanto en condiciones básicas como lógicas.// De forma predeterminada, la palabra clave se envuelve con % a ambos lados para realizar una coincidencia parcial.
$database->select("person", "id", [
"city[~]" => "lon"
]);
WHERE "city" LIKE '%lon%'
Coincidencia de grupos
$database->select("person", "id", [
"city[~]" => ["lon", "foo", "bar"]
]);
WHERE "city" LIKE '%lon%' OR "city" LIKE '%foo%' OR "city" LIKE '%bar%'
Condiciones LIKE negativas
$database->select("person", "id", [
"city[!~]" => "lon"
]);
WHERE "city" NOT LIKE '%lon%'
Condiciones LIKE compuestas
$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%')
Comodines SQL
Puede utilizar patrones comodín SQL para obtener coincidencias más avanzadas.
$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, ...
]);
Condiciones de ordenación
Utilice
ORDER para ordenar el conjunto de resultados.// Ordena por una sola columna.
$database->select("account", "user_id", [
"ORDER" => "user_id"
]);
// Ordena por varias columnas.
$database->select("account", "user_id", [
"ORDER" => [
// Ordena una columna con un orden personalizado.
"user_id" => [43, 12, 57, 98, 144, 1],
// Ordena una columna usando la direccion predeterminada.
"register_date",
// Orden descendente.
"profile_id" => "DESC",
// Orden ascendente.
"date" => "ASC"
]
]);
Búsqueda de texto completo
MySQL admite la búsqueda de texto completo para consultas de búsqueda más avanzadas.
Modos de búsqueda
| natural | Modo de lenguaje natural |
| natural+query | Modo de lenguaje natural con expansion de consulta |
| boolean | Modo booleano |
| query | Con expansion de consulta |
// Condición MATCH.
$database->select("post_table", "post_id", [
"MATCH" => [
"columns" => ["content", "title"],
"keyword" => "foo",
// Opcional: modo de busqueda.
"mode" => "natural"
]
]);
WHERE MATCH (content, title) AGAINST ('foo' IN NATURAL LANGUAGE MODE)
Expresiones regulares
Utilice el operador [REGEXP] para hacer coincidir valores con una expresión regular.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'user_name[REGEXP]' => '[a-z0-9]*'
]);
WHERE "user_name" REGEXP '[a-z0-9]*'
Funciones SQL
Para casos avanzados, puede utilizar funciones SQL a través del objeto raw. Lea más en la documentación raw.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'datetime' => Medoo::raw('NOW()')
]);
WHERE "datetime" = NOW()
LIMIT y OFFSET
Utilice LIMIT para restringir el número de filas devueltas. También puede especificar un desplazamiento.
// Devuelve las primeras 100 filas.
$database->select("account", "user_id", [
"LIMIT" => 100
]);
// Omite las primeras 20 filas y luego devuelve las siguientes 100.
$database->select("account", "user_id", [
"LIMIT" => [20, 100]
]);
// En Oracle y MSSQL tambien se requiere ORDER BY.
$database->select("account", "user_id", [
"LIMIT" => [20, 100],
"ORDER" => "location"
]);
GROUP BY y HAVING
Utilice
GROUP para agrupar filas y HAVING para filtrar resultados agrupados.// Agrupa por una sola columna.
$database->select("account", "user_id", [
"GROUP" => "type"
]);
// Agrupa por varias columnas.
$database->select("account", "user_id", [
"GROUP" => [
"type",
"age",
"gender"
]
]);
// Agrupa filas y filtra el resultado agrupado.
$database->select("account", "user_id", [
"GROUP" => "type",
"HAVING" => [
"user_id[>]" => 500
]
]);