Versão: v2.3.0
Sintaxe do WHERE
Alguns métodos Medoo aceitam um argumento
$where para filtrar registros, semelhante à cláusula SQL WHERE. Embora as condições SQL possam se tornar complexas e introduzir riscos de injeção de SQL quando escritas manualmente, Medoo fornece uma maneira estruturada e expressiva de construir cláusulas WHERE com segurança.Condições Básicas
As condições básicas são fáceis de usar. Você também pode acrescentar operadores ao nome de uma coluna para criar comparações mais avançadas, 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
Os operadores
[<>] e [><] também podem ser usados com valores de data e 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')
Você pode passar não apenas uma única string ou valor numérico, mas também um array. Nesse caso, Medoo gera uma condição 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')
Condições Negativas
Use o operador [!] para criar comparações negativas, como !=, 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
Você também pode usar o resultado de select() ou get() como o valor de uma condição.
$database->select("account", "user_name", [
"user_id" => $database->select("post", "user_id", ["comments[>]" => 40])
]);
WHERE user_id IN (2, 51, 321, 3431)
Condições Lógicas
As condições lógicas descrevem relacionamentos entre múltiplas expressões. Use AND e OR para criar consultas mais complexas.
Uso Básico
$database->select("account", "user_name", [
"AND" => [
"user_id[>]" => 200,
"age[<>]" => [18, 25],
"gender" => "female"
]
]);
// Por padrão, o Medoo combina as condições com AND. A consulta abaixo é 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'
Condições aninhadas
$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'
Como Medoo usa matrizes para descrever condições lógicas, chaves duplicadas na mesma matriz substituirão umas às outras.
// Isto não funcionará como esperado.
$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 colisões de chaves, anexe um comentário após o nome da chave lógica. O comentário começa com # e pode conter qualquer texto.
$database->select("account", '*', [
"AND #Comentários podem ser usados com qualquer condição lógica AND ou OR" => [
"OR #primeira condição" => [
"user_name" => "foo",
"email" => "foo@bar.com"
],
"OR #segunda condição" => [
"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')
)
Relacionamentos de coluna
$database->select("post", [
"[>]account" => "user_id",
], [
"post.content"
], [
// Compare colunas com operadores em nomes de coluna totalmente qualificados, como [=], [>], [<] e [!=].
"post.restrict[<]account.age"
]);
WHERE "post"."restrict" < "account"."age"
Condições LIKE
Use o operador
[~] para criar condições LIKE. Pode ser usado em condições básicas e lógicas.// Por padrão, a palavra-chave é envolvida por % em ambos os lados para realizar uma correspondência parcial.
$database->select("person", "id", [
"city[~]" => "lon"
]);
WHERE "city" LIKE '%lon%'
Correspondência de grupo
$database->select("person", "id", [
"city[~]" => ["lon", "foo", "bar"]
]);
WHERE "city" LIKE '%lon%' OR "city" LIKE '%foo%' OR "city" LIKE '%bar%'
Condições LIKE negativas
$database->select("person", "id", [
"city[!~]" => "lon"
]);
WHERE "city" NOT LIKE '%lon%'
Condições LIKE compostas
$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%')
Curingas SQL
Você pode usar padrões curinga SQL para uma correspondência mais avançada.
$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, ...
]);
Condições de ordenação
Use
ORDER para ordenar o conjunto de resultados.// Ordena por uma única coluna.
$database->select("account", "user_id", [
"ORDER" => "user_id"
]);
// Ordena por várias colunas.
$database->select("account", "user_id", [
"ORDER" => [
// Ordena uma coluna usando uma ordem personalizada.
"user_id" => [43, 12, 57, 98, 144, 1],
// Ordena uma coluna usando a direção padrão.
"register_date",
// Ordena em ordem decrescente.
"profile_id" => "DESC",
// Ordena em ordem crescente.
"date" => "ASC"
]
]);
Pesquisa de texto completo
A pesquisa de texto completo é suportada por MySQL para consultas de pesquisa mais avançadas.
Modos de pesquisa
| natural | Modo de linguagem natural |
| natural+query | Modo de linguagem natural com expansão de consulta |
| boolean | Modo booleano |
| query | Com expansão de consulta |
// Condicao MATCH.
$database->select("post_table", "post_id", [
"MATCH" => [
"columns" => ["content", "title"],
"keyword" => "foo",
// Opcional: modo de pesquisa.
"mode" => "natural"
]
]);
WHERE MATCH (content, title) AGAINST ('foo' IN NATURAL LANGUAGE MODE)
Expressões Regulares
Use o operador [REGEXP] para combinar valores com uma expressão regular.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'user_name[REGEXP]' => '[a-z0-9]*'
]);
WHERE "user_name" REGEXP '[a-z0-9]*'
Funções SQL
Para casos avançados, você pode usar funções SQL por meio do objeto raw. Leia mais na documentação raw.
$data = $database->select('account', [
'user_id',
'user_name'
], [
'datetime' => Medoo::raw('NOW()')
]);
WHERE "datetime" = NOW()
LIMIT e OFFSET
Use LIMIT para restringir o número de linhas retornadas. Você também pode especificar um deslocamento.
// Retorna as primeiras 100 linhas.
$database->select("account", "user_id", [
"LIMIT" => 100
]);
// Ignora as primeiras 20 linhas e depois retorna as 100 seguintes.
$database->select("account", "user_id", [
"LIMIT" => [20, 100]
]);
// Para Oracle e MSSQL, ORDER BY também é obrigatório.
$database->select("account", "user_id", [
"LIMIT" => [20, 100],
"ORDER" => "location"
]);
GROUP BY e HAVING
Use GROUP para agrupar linhas e HAVING para filtrar resultados agrupados.
// Agrupa por uma única coluna.
$database->select("account", "user_id", [
"GROUP" => "type"
]);
// Agrupa por várias colunas.
$database->select("account", "user_id", [
"GROUP" => [
"type",
"age",
"gender"
]
]);
// Agrupa linhas e filtra o resultado agrupado.
$database->select("account", "user_id", [
"GROUP" => "type",
"HAVING" => [
"user_id[>]" => 500
]
]);