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
18/06/2025, by Ivan

Merge upiti predstavljaju posebnu vrstu hibridnog upita. Iako je sintaksa za njih definisana u SQL 2003 specifikaciji, praktično nijedna baza podataka ne podržava standardnu sintaksu. Međutim, većina njih pruža alternativnu implementaciju koristeći sintaksu specifičnu za bazu podataka. Drupal-ov konstruktor merge upita apstrahuje koncept merge upita u strukturirani objekat koji može biti kompajliran sa odgovarajućom sintaksom za svaku bazu podataka. Ponekad se nazivaju i "UPSERT" upitima, kombinacijom UPDATE i INSERT.

U opštem smislu, merge upit je kombinacija upita za ubacivanje i upita za ažuriranje. Ako je određeni uslov ispunjen, na primer, red sa datim primarnim ključem već postoji, izvršava se upit za ažuriranje. Ako ne postoji, izvršava se upit za ubacivanje. U najčešćem slučaju to je ekvivalentno:

if ($connection->query("SELECT COUNT(*) FROM {example} WHERE id = :id", [':id' => $id])->fetchField()) {
  // Izvrši ažuriranje koristeći WHERE id = $id
}
else {
  // Izvrši ubacivanje, ubacujući $id za id 
}

Stvarna implementacija se jako razlikuje od baze do baze. Obratite pažnju da iako su merge upiti konceptualno atomarne operacije, oni mogu ili ne moraju biti zaista atomski u zavisnosti od implementacije konkretne baze podataka. Na primer, MySQL implementacija je jedan atomaran upit, ali pojednostavljeni slučaj (gore) nije.

Najčešće idiome za merge upite možete videti u nastavku.

Jednostavno postavi

$connection->merge('example')
  ->key('name', $name)
  ->fields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->execute();

U primeru iznad mi navodimo upitu da radi sa tabelom „example“. Zatim navodimo jedno ključno polje 'name' sa vrednošću $name. Nakon toga navodimo niz vrednosti koje treba postaviti.

Ako već postoji red gde polje „name“ ima vrednost $name, tada će polja field1 i field2 biti postavljena na odgovarajuće vrednosti u tom postojećem redu. Ako takav red ne postoji, biće kreiran red gde je name vrednost $name, field1 vrednost $value1, a field2 vrednost $value2. Tako da na kraju upita krajnji rezultat ostaje isti bez obzira da li je red već postojao ili ne.

Uslovno postavljanje

U nekim slučajevima može biti potrebno postaviti vrednosti na različite načine u zavisnosti od toga da li zapis već postoji, kako je definisano poljima key(). Postoje dva načina da se to uradi.

$connection->merge('example')
  ->insertFields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->updateFields([
    'field1' => $alternate1,
  ])
  ->key('name', $name)
  ->execute();

Primer iznad će se ponašati isto kao i prvi, osim što ako zapis već postoji i ažurira se, za field1 će biti postavljena vrednost $alternate1 umesto $value1, a na field2 to neće uticati. Metod updateFields() prihvata ili jedan asocijativni niz vrednosti, ili dva paralelna numerička niza, jedan sa poljima, drugi sa vrednostima, koji moraju biti u istom redosledu.

$connection->merge('example')
  ->key('name', $name)
  ->fields([
      'field1' => $value1,
      'field2' => $value2,
  ])
  ->expression('field1', 'field1 + :inc', [':inc' => 1])
  ->execute();

U ovom primeru, ako zapis već postoji, za field1 će biti postavljena njena trenutna vrednost uvećana za 1. Ovo je veoma korisno za „brojačke upite“, kada želite da povećavate neki brojač u bazi svaki put kada se određeni događaj dogodi. field2 će i dalje imati istu vrednost bez obzira da li zapis postoji ili ne.

Obratite pažnju da expression() može biti pozvan više puta, po jednom za svako polje koje treba postaviti izrazom ako zapis već postoji. Prvi parametar je polje, drugi je SQL fragment koji definiše izraz kojem polje treba biti postavljeno, a opciono treći parametar je niz vrednosti za zamenu u izrazu.

Nije ni potrebno da polje koje se koristi u expression() već bude prisutno u fields().

Uzimajući u obzir gornji API, moguće je definisati upite koji nemaju logički smisao, na primer ako se za polje postavi i da se ignoriše i da se postavi izraz ako zapis postoji. Da bi se minimizirale moguće greške, sledeća pravila se primenjuju:

  • Ako je za polje postavljen expression(), on ima prednost nad updateFields().
  • Ako su vrednosti date u updateFields(), samo ta polja će biti menjana ako zapis već postoji. Polja koja nisu navedena u updateFields() neće biti dira­na.

Imajte u vidu da je i dalje moguće definisati upite koji nemaju smisla. Programer treba da se pobrine da ne navede nelogičan upit, jer je ponašanje u tom slučaju neodređeno.

Source URL:

Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.