Qualsiasi query può avere una corrispondente «query di conteggio». Una query di conteggio restituisce il numero di righe della query originale. Per ottenere una query di conteggio da una query esistente (che è un oggetto query select che implementa SelectInterface), utilizza il metodo countQuery().
Alcune query SQL possono restituire risultati duplicati. In tali casi le righe duplicate possono essere filtrate utilizzando la parola chiave «DISTINCT» in una query statica. In una query dinamica, utilizza il metodo distinct().
Per raggruppare in base a un determinato campo, utilizza il metodo groupBy().
$query->groupBy('uid');
Il codice sopra indicherà alla query di raggruppare per il campo uid. Nota che il nome del campo qui deve essere un alias creato dai metodi addField() o addExpression(), quindi nella maggior parte dei casi vorrai usare il valore restituito da questi metodi per assicurarti che venga usato l’alias corretto.
Per ottenere il conteggio delle righe raggruppate per un campo, ad esempio uid, puoi fare quanto segue:
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:
Una query Select restituirà sempre un oggetto set di risultati contenente zero o più record. Esistono diversi modi per ottenere i dati da questo set di risultati a seconda del caso d’uso. I record vengono recuperati come oggetti per impostazione predefinita, a meno che tu non modifichi la modalità di recupero (vedi: setFetchMode).
Il caso più comune è iterare sul set di risultati con un ciclo foreach().
Le query possono essere recuperate in oggetti basati su classi personalizzate. Ad esempio, se abbiamo una classe chiamata ExampleClass, la seguente query restituirà oggetti di tipo ExampleClass.
$result = $connection->query("SELECT id, title FROM {example_table}", [], [
'fetch' => 'ExampleClass',
]);
Se la classe ha un metodo __construct(), gli oggetti verranno creati, le proprietà verranno aggiunte all’oggetto e poi verrà invocato il metodo __construct(). Ad esempio, se hai la seguente classe e query:
Le query di inserimento devono sempre utilizzare l’oggetto query builder. Alcuni database richiedono una gestione speciale per i campi LOB (Large OBject, ad esempio TEXT in MySQL) e BLOB (Binary Large OBject), quindi è necessario un livello di astrazione per consentire ai singoli driver di database di implementare qualsiasi gestione speciale di cui abbiano bisogno.
Le query di inserimento vengono avviate utilizzando il metodo insert() nel modo seguente:
Le query di unione (merge) rappresentano un tipo speciale di query ibrida. Sebbene la loro sintassi sia definita nella specifica SQL 2003, praticamente nessun database supporta la sintassi standard. Tuttavia, la maggior parte fornisce un’implementazione alternativa con una sintassi specifica per il database. Il query builder di merge in Drupal astrae il concetto di query di unione in un oggetto strutturato, che può essere compilato con la sintassi appropriata per ciascun database. Talvolta vengono chiamate query "UPSERT", una combinazione di UPDATE e INSERT.
Le query di eliminazione devono sempre utilizzare l’oggetto query builder. Vengono avviate usando il metodo delete() nel modo seguente:
$query = $connection->delete('mytable', $options);
Questo crea un oggetto query di eliminazione, che rimuove i record dalla tabella mytable. Nota che non sono necessarie le parentesi graffe per il nome della tabella, poiché il query builder lo gestirà automaticamente.
Drupal supporta anche le transazioni, inclusa una modalità di fallback trasparente per i database che non supportano le transazioni. Tuttavia, le transazioni possono diventare piuttosto complicate se si tenta di avviarne due contemporaneamente. Il comportamento in questo caso dipende anche dal database.