Condizioni (Condition)
Per aggiungere una clausola WHERE a una query dinamica, utilizza il metodo condition():
$query->condition('bundle', 'article', '=');
Il codice sopra istruirà la query a filtrare i risultati per il bundle article. Nota che il nome del campo qui deve essere un alias creato dai metodi addField() o addExpression().
Parametri di Condition
Il metodo condition() accetta tre parametri:
- $field - il campo da confrontare (obbligatorio).
- $value - il valore da confrontare (opzionale, predefinito NULL).
- $operator - l’operatore di confronto (opzionale, predefinito ‘=’).
Operatori supportati
Gli operatori di confronto comuni '=', '<>', '<', '<=', '>', '>=' sono supportati in tutti i tipi di database supportati.
Utilizzo di IN, NOT IN
Gli operatori IN e NOT IN accettano un array in $value e confrontano il valore del campo con i valori dell’array.
$users = [2,5,17,22];
$query->condition('uid', $users, 'IN');
In questo esempio la query restituirà i record in cui uid è uguale a 2, 5, 17 o 22.
Utilizzo di BETWEEN e NOT BETWEEN
Gli operatori BETWEEN e NOT BETWEEN accettano un array di due valori per il confronto.
$query->condition('count', [5,10], 'BETWEEN');
In questo esempio la query restituirà i record con count compreso tra 5 e 10.
Utilizzo di IS NULL, IS NOT NULL, EXISTS e NOT EXISTS
Per convenzione, utilizza i seguenti metodi invece del metodo condition():
$query->isNull($field); $query->isNotNull($field); $query->exists($field); $query->notExists($field);
Anche se una condizione come $query->condition($field, NULL, 'IS NOT NULL'); dovrebbe funzionare, la convenzione sopra è raccomandata.
Altri operatori
Altri operatori, come BINARY o altri specifici per il database in uso, potrebbero funzionare o meno. Tienilo a mente quando sviluppi moduli che possono essere usati su diversi sistemi.
Utilizzo di più Conditions
È possibile aggiungere più metodi condition() per filtrare ulteriormente la query.
$query->condition('bundle', 'article', '=');
$query->condition('status', 1, '=');
Se esistono più condition(), come nell’esempio sopra, tutte le condizioni devono essere vere affinché un record appaia nel risultato della query (cioè le condizioni sono combinate con AND).
Suggerimento: per ottenere una query con condizioni solo OR, usa una orConditionGroup.
Gruppi di Conditions
I gruppi di condizioni possono essere usati per creare espressioni WHERE più complesse (incluso OR) all’interno della clausola della query. Esistono due tipi di gruppi di condizioni:
- orConditionGroup - restituisce un oggetto di condizioni unite con OR
- andConditionGroup - restituisce un oggetto di condizioni unite con AND
I gruppi di condizioni restituiscono un oggetto, che può poi essere aggiunto come condizione alla query.
// Crea l’orConditionGroup
$orGroup = $query->orConditionGroup()
->condition('promoted', 1)
->condition('uid', [2,4,7,22], 'IN');
// Aggiungi il gruppo alla query.
$query->condition($orGroup);
In questo esempio le condizioni per promoted e uid vengono aggiunte alla clausola WHERE della query, raggruppate insieme con OR. Questo porterà a una WHERE che appare così:
WHERE (promoted = 1 OR uid IN (2,4,7,22))
Se necessario, è possibile aggiungere più gruppi orConditionGroup e andConditionGroup. I gruppi di condizioni possono essere annidati per esigenze WHERE più complesse.
Dato il seguente esempio di clausola WHERE:
WHERE (a = 1 OR b = 1) AND ((c = 1 AND d = 1) OR (e = 1))
Le condizioni della query possono essere scritte con gruppi di condizioni come segue:
$orGroup1 = $query->orConditionGroup()
->condition('a', 1)
->condition('b', 1);
$andGroup1 = $query->andConditionGroup()
->condition('c', 1)
->condition('d', 1);
$orGroup2 = $query->orConditionGroup()
->condition($andGroup1)
->condition('e', 1);
$query->condition($orGroup1);
$query->condition($orGroup2);