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 8 - INSERT INTO upiti (ubacivanje)

26/05/2025, by Ivan

INSERT upiti uvek treba da koriste konstruktor upita. Neke baze podataka zahtevaju specijalne tretmane za LOB (Large OBject, poput TEXT u MySQL) i BLOB (Binary Large OBject) polja, pa je potreban nivo apstrakcije za pojedinačne drajvere baza da implementiraju ove tretmane.

INSERT upiti počinju korišćenjem funkcije db_insert():

<?php
$query = db_insert('node', $options);
?>

Ovaj upit kreira objekat upita koji ubacuje jedan ili više zapisa u tabelu node. Napomena: nije potrebno koristiti viticaste zagrade oko imena tabele, konstruktor upita to automatski radi.

INSERT upiti koriste fluent API, što znači da svi metodi (uključujući execute()) vraćaju objekat na sebi, omogućavajući lančano pozivanje.

INSERT upiti podržavaju različite obrasce za različite potrebe. Najčešći tok rada opisuje polja u koja se ubacuju podaci, i vrednosti koje se ubacuju. Najčešće korišćeni obrasci su opisani ispod.

Skraćeni oblik (Compact form)

Preporučeni oblik za većinu upita u kompaktnom obliku:

<?php
$nid = db_insert('node')
  ->fields(array(
    'title' => 'Example',
    'uid' => 1,
    'created' => REQUEST_TIME,
  ))
  ->execute();
?>

Ovaj upit je ekvivalentan sledećem SQL upitu:

INSERT INTO {node} (title, uid, created) VALUES ('Example', 1, 1221717405);

Primer povezuje ključeve sa vrednostima za ubacivanje.

 

<?php
db_insert('node')
?>

 

Ova linija kreira novi objekat upita za tabelu node.

<?php
  ->fields(array(
    'title' => 'Example',
    'uid' => 1,
    'created' => REQUEST_TIME,
  ))
?>

Metod fields() prima uglavnom jedan asocijativni niz. Ključevi niza su nazivi kolona u koje se ubacuju vrednosti, a vrednosti su podaci koji će biti ubačeni. Rezultat je upit za ubacivanje u navedenu tabelu.

  ->execute();
?>

Za razliku od ostalih metoda, execute() vraća vrednost polja sa automatskim povećanjem (auto-increment) koje je korišćeno za ubacivanje. Za tabelu node to će biti vrednost nid. Ako tabela nema polje sa auto-increment, vrednost koju execute() vraća biće undefined i ne treba joj verovati. Uobičajeno, ovo je preferiran način za INSERT upite.

Jednostavniji oblik (Degenerate form)

<?php
$nid = db_insert('node')
  ->fields(array('title', 'uid', 'created'))
  ->values(array(
    'title' => 'Example',
    'uid' => 1,
    'created' => REQUEST_TIME,
  ))
  ->execute();
?>

Ovaj upit je ekvivalentan sledećem i daje isti rezultat:

  ->fields(array('title', 'uid', 'created'))
?>

Kada se fields() pozove sa indeksiranim nizom, definiše kolone koje će se koristiti u upitu bez vrednosti. Ovo je potrebno za višestruke INSERT upite.

  ->values(array(
    'title' => 'Example',
    'uid' => 1,
    'created' => REQUEST_TIME,
  ))
?>

Metod values() opisuje asocijativni niz sa imenima polja i vrednostima za ubacivanje. Može primiti i indeksirani niz, pri čemu redosled vrednosti mora odgovarati redosledu polja iz fields(). Kod asocijativnih nizova redosled nije bitan. Indeksirani nizovi se retko koriste jer je skraćeni oblik češći. Razlog za razdvajanje fields() i values() je podrška za višestruke INSERT upite.

Višestruki INSERT (Multi-insert form)

Objekat upita može prihvatiti više skupova vrednosti. Metod values() može se pozvati više puta da bi ubacio više redova u jednom upitu. Ovo zavisi od podrške baze podataka. Većina baza izvršava višestruke INSERT upite u jednoj transakciji radi bolje efikasnosti. MySQL koristi sledeću sintaksu za višestruke upite:

<?php
$values = array(
  array(
    'title' => 'Example',
    'uid' => 1,
    'created' => REQUEST_TIME,
  ),
  array(
    'title' => 'Example 2',
    'uid' => 1,
    'created' => REQUEST_TIME,
  ),
  array(
    'title' => 'Example 3',
    'uid' => 2,
    'created' => REQUEST_TIME,
  ),
);
$query = db_insert('node')->fields(array('title', 'uid', 'created'));
foreach ($values as $record) {
  $query->values($record);
}
$query->execute();
?>

Primer prikazuje kako se tri upita za ubacivanje izvršavaju zajedno u jednom bloku, koristeći efikasnu metodu koju omogućava drajver baze. Objekat upita je sačuvan u promenljivoj da bismo mogli u petlji pozivati values() više puta.

Primer sa razdvajanjem values() i fields() ekvivalentan je sledećim upitima:

INSERT INTO {node} (title, uid, created) VALUES ('Example', 1, 1221717405);
INSERT INTO {node} (title, uid, created) VALUES ('Example 2', 1, 1221717405);
INSERT INTO {node} (title, uid, created) VALUES ('Example 3', 2, 1221717405);

Vrednost koju execute() vraća za višestruke INSERT upite je undefined i ne treba joj verovati jer se razlikuje između drajvera baza.

INSERT baziran na SELECT upitu (Sinteza tabela)

Ako želite popuniti tabelu rezultatima iz drugih tabela (sinteza tabela), možete koristiti SELECT da izvučete podatke, obradite ih u PHP i ubacite u novu tabelu, ili možete koristiti INSERT INTO ... SELECT FROM upit koji ubacuje rezultate direktno.

Primer pravljenja tabele "mytable" sa svim nid i korisničkim imenima za sve nodove:

Drupal 6

<?php
db_query('INSERT INTO {mytable} (nid, name) SELECT n.nid, u.name FROM {node} n LEFT JOIN {users} u on n.uid = u.uid WHERE n.type = "%s"', array ('page'));
?>

Drupal 7

<?php
// Kreiramo SELECT upit.
$query = db_select('node', 'n');
// Pridruživanje users tabele.
$query->join('users', 'u', 'n.uid = u.uid');
// Dodajemo željena polja.
$query->addField('n','nid');
$query->addField('u','name');
// Dodajemo uslov da biramo samo 'page' nodove.
$query->condition('type', 'page');

// Izvršavamo INSERT.
db_insert('mytable')
  ->from($query)
  ->execute();
?>

Podrazumevane vrednosti (Default values)

Uobičajeno, ako ne navedete vrednost za polje, a u opisu tabele postoji podrazumevana vrednost, baza će je tiho postaviti. Međutim, u nekim slučajevima treba eksplicitno reći bazi da koristi podrazumevane vrednosti, na primer ako želite da sve vrednosti budu podrazumevane. To možete uraditi metodom useDefaults().

<?php
$query->useDefaults(array('field1', 'field2'));
?>

Ovaj kod tera upit da za polja field1 i field2 koristi podrazumevane vrednosti. Važno je da polja koja se navode u useDefaults() ne budu navedena u fields() ili values(), jer će to izazvati grešku.