logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll

Rad sa bazom podataka u Drupal 7 - lekcija 12 - Uslovi upita (WHERE, HAVING, LIKE)

26/05/2025, by Ivan

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))
?>