Rad sa bazom podataka u Drupal 7 - lekcija 12 - Uslovi upita (WHERE, HAVING, LIKE)
Uslov upita omogućava da izaberemo samo one zapise koji zadovoljavaju određene kriterijume, na primer nodove kreirane ne starije od dve nedelje, termine koji sadrže reč „drupal“ i slično. U SQL-u koristimo WHERE i HAVING da postavimo ograničenja na SELECT, UPDATE, DELETE upite. U dinamičkim upitima je takođe implementiran mehanizam za rad sa uslovima upita. Ovaj mehanizam radi isto za sva tri tipa upita: selekciju, ažuriranje i brisanje.
Koncept uslovnih izraza
Uslov je sadržan u posebnom izrazu koji postavlja ograničenje.
Spajanje (konjunkcija)
Svaki uslov može sadržati više uslovnih izraza koji se spajaju. Uslovi se spajaju pomoću operatora AND (I) i OR (ILI).
Objekat uslova
Drupal predstavlja svaki deo uslova kao instancu klase QueryConditional. Objekat uslova je instanca klase QueryConditional.
Razmotrimo primer SQL upita:
SELECT FROM {mytable} WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))
Uslovni izraz:
WHERE (a = 1 AND b = 'foo' OR (c = 'bar'))
Delovi uslovnog izraza:
(a = 1 AND b = 'foo' OR (c = 'bar'))
(c = 'bar')
Operatori za spajanje uslova:
AND, OR
Objekti SELECT, UPDATE i DELETE upita se realizuju preko interfejsa QueryConditionalInterface koji pruža interfejse za svaki tip upita. Taj objekat se zatim obavija u objekat QueryConditional. Klasa QueryConditional može se pozivati direktno.
Svaki deo uslovnog izraza spaja se preko operatora AND. Jedan ili više delova uslova mogu se povezati sa drugim operatorima poput OR.
API
Postoje dve glavne metode za korišćenje uslovnih objekata:
$query->condition($field, $value = NULL, $operator = '=')
Metoda condition()
omogućava definisanje polja, vrednosti i operatora uslovnog izraza. Ova metoda se koristi za binarna poređenja (gde je rezultat TAČNO ili NETAČNO), kao što su =, <, >=, LIKE i drugi. Ako operator nije definisan, koristi se podrazumevani = (tačna jednakost). Tako da za obična poređenja možemo pisati condition('myfield', $value)
, što će se pretvoriti u myfield = :value
, gde će :value biti zamenjeno vrednošću promenljive $value
.
$query->where($snippet, $args = array())
Metoda where()
je dodatna jer se može koristiti condition()
umesto nje. Međutim, where()
se često koristi, pa je izdvojena kao posebna metoda. U promenljivoj $snippet
pišemo običan SQL uslov, a u $args
niz zamena za placeholder-e iz $snippet
.
Korišćenje condition()
je poželjnije od where()
.
Uslovi sa nizovima
Dešava se da je potrebno formirati uslov sa više vrednosti. U tom slučaju u upit šaljemo niz vrednosti. Najčešći SQL operatori u ovakvim situacijama su IN i BETWEEN. Operator IN prihvata samo tačno poklapanje sa jednom od vrednosti u nizu.
<?php $query->condition('myfield', array(1, 2, 3), 'IN'); // Postaje: myfield IN (:db_placeholder_1, :db_placeholder_2, :db_placeholder_3) ?>
Ovako ćemo izabrati sve zapise u polju myfield
koji imaju vrednosti 1, 2 ili 3.
Ako treba definisati opseg vrednosti, koristimo BETWEEN:
<?php $query->condition('myfield', array(5, 10), 'BETWEEN'); // Postaje: myfield BETWEEN :db_placeholder_1 AND :db_placeholder_2 ?>
Ovako biramo zapise gde je vrednost u polju myfield
između 5 i 10.
Ugnježdeni uslovi
Prvi parametar condition()
može biti i drugi uslovni objekat. Ugnježdeni uslov može biti uključen u drugi, složeniji uslov. Rezultat su složeni izrazi povezani sa AND i OR gde treba.
Helper db_condition()
vraća novi objekat uslova. Ovaj metod prima tip spajanja uslova (AND, OR, XOR). Takođe postoje gotovi helperi: db_or()
, db_xor()
, db_and()
. Uglavnom ovi helperi su dovoljni. Primer:
<?php $query ->condition('field1', array(1, 2), 'IN') ->condition(db_or()->condition('field2', 5)->condition('field3', 6)) // Rezultat: // (field1 IN (:db_placeholder_1, :db_placeholder_2) AND (field2 = :db_placeholder3 OR field3 = :db_placeholder_4)) ?>
Vrednosti NULL
Za proveru NULL vrednosti koristite:
<?php $query->isNull('myfield'); // Rezultat: (myfield IS NULL) $query->isNotNull('myfield'); // Rezultat: (myfield IS NOT NULL) ?>
Ove metode isNull()
i isNotNull()
mogu se kombinovati sa where()
i condition()
.
Napomena: pozivanje condition('myfield', NULL)
je zastarelo, koristite isNull()
i isNotNull()
.
Podupiti (subquery)
Metod condition()
podržava podupite za parametar $value
. Za kreiranje podupita koristi se klasa SelectQuery, koja se dobija pozivom db_select()
. Umesto poziva execute()
, podupit se prosleđuje metodu condition()
.
Podupiti su pogodni za jednostavne kratke upite sa uslovom na jedno polje. Za složenije upite je bolje koristiti samostalne db_select()
upite.
Evo primera podupita:
db_delete()
<?php db_delete('sessions') ->condition('timestamp', REQUEST_TIME - $lifetime, '<') ->execute(); // DELETE FROM {sessions} WHERE (timestamp < 1228713473) ?>
db_update()
<?php db_update('sessions') ->fields(array( 'sid' => session_id() )) ->condition('sid', $old_session_id) ->execute(); // UPDATE {sessions} SET sid = 'abcde' WHERE (sid = 'fghij'); ?>
db_delete() sa OR uslovom
<?php // Iz taxonomy_term_save(): $or = db_or()->condition('tid1', 5)->condition('tid2', 6); db_delete('term_relation')->condition($or)->execute(); // DELETE FROM {term_relation} WHERE ((tid1 = 5 OR tid2 = 6)) ?>