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

Upiti za ubacivanje uvek treba da koriste objekat konstruktora upita. U nekim bazama podataka potrebna je posebna obrada LOB (Large OBject, npr. TEXT u MySQL) i BLOB (Binary Large OBject) polja, zbog čega je potreban nivo apstrakcije da bi pojedinačni drajveri baza mogli da implementiraju bilo kakvu posebnu obradu koja im je potrebna.

Upiti za ubacivanje se pokreću korišćenjem metode insert() na sledeći način:

$query = $connection->insert('mytable', $options);

Ovo kreira objekat upita za ubacivanje koji će ubaciti jedan ili više zapisa u tabelu mytable. Obratite pažnju da nisu potrebne vitičaste zagrade oko imena tabele, jer će konstruktor upita to automatski obraditi.

Objekat upita za ubacivanje koristi fluent API. To znači da svi metodi (osim execute()) vraćaju sam objekat upita, omogućavajući lančano pozivanje metoda. U mnogim slučajevima to znači da objekat upita uopšte nije potrebno čuvati u promenljivoj.

Objekat upita za ubacivanje podržava nekoliko različitih šablona korišćenja kako bi zadovoljio različite potrebe. Uopšteno, radni tok se sastoji iz navođenja polja u koja će upit ubacivati vrednosti, definisanja vrednosti koje će biti ubačene za ta polja, i izvršavanja upita. Najčešći preporučeni obrasci korišćenja navedeni su u nastavku.

Kompaktni oblik

Preporučeni oblik za većinu upita za ubacivanje je kompaktni oblik:

$result = $connection->insert('mytable')
  ->fields([
    'title' => 'Example',
    'uid' => 1,
    'created' => \Drupal::time()->getRequestTime(),
  ])
  ->execute();

Ovo će biti ekvivalent sledećem upitu:

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

Gornji fragment kombinuje ključne delove procesa ubacivanja.

$connection->insert('mytable')

Ova linija kreira novi objekat upita za ubacivanje u tabelu mytable.

  ->fields([
    'title' => 'Example',
    'uid' => 1,
    'created' => \Drupal::time()->getRequestTime(),
  ])

Metod fields() može prihvatiti nekoliko oblika parametara, ali najčešće se koristi jedan asocijativni niz. Ključevi niza su kolone tabele u koje treba ubaciti vrednosti, a vrednosti su odgovarajuće vrednosti za ubacivanje. Ovo će proizvesti jedan upit za ubacivanje u navedenu tabelu.

 ->execute();

Metod execute() naređuje izvršavanje upita. Ako se ovaj metod ne pozove, upit se neće izvršiti.

Za razliku od ostalih metoda objekta upita Insert koji vraćaju sam objekat upita, execute() vraća vrednost polja autoinkrementa (sekvencijalni tip definisan u hook_schema()), koje je popunio upit Insert, ako takvo polje postoji. Zato se u primeru iznad vraćena vrednost dodeljuje promenljivoj $result. Ako polje autoinkrementa ne postoji, vraćena vrednost execute() nije definisana i ne može joj se verovati.

U tipičnom slučaju, ovo je preporučeni format za upite za ubacivanje.

Degenerisani oblik

$result = $connection->insert('mytable')
  ->fields(['title', 'uid', 'created'])
  ->values([
    'title' => 'Example',
    'uid' => 1,
    'created' => \Drupal::time()->getRequestTime(),
  ])
  ->execute();

Ovo je nešto detaljniji ekvivalent prethodnom upitu i daće isti rezultat.

  ->fields(['title', 'uid', 'created'])

Kada se fields() pozove sa indeksiranim nizom umesto asocijativnog, on postavlja samo polja (kolone baze podataka) koja će biti korišćena u upitu, bez postavljanja vrednosti za njih. Ovo je korisno za kasnije pokretanje višestrukog upita.

  ->values([
    'title' => 'Example',
    'uid' => 1,
    'created' => \Drupal::time()->getRequestTime(),
  ])

Ovaj poziv metode postavlja asocijativni niz imena polja za vrednosti koje treba ubaciti u ta polja. Metod values() može takođe prihvatiti indeksirani niz. Ako se koristi indeksirani niz, redosled vrednosti mora odgovarati redosledu polja u metodu fields(). Ako se koristi asocijativni niz, može biti u bilo kom redosledu. Obično je asocijativni niz poželjniji radi lakšeg čitanja.

Ovaj oblik upita se retko koristi, jer je kompaktni oblik češći. U većini slučajeva jedini razlog za razdvajanje fields() i values() je izvršavanje višestrukog upita.

Oblik sa višestrukim ubacivanjima

Objekat upita Insert može takođe prihvatiti više skupova vrednosti. To znači da values() može biti pozvan više puta da stavi u red nekoliko upisa. Kako će se to tačno odvijati zavisi od mogućnosti baze podataka. U većini baza, više upisa biće izvršeno zajedno unutar transakcije radi veće integriteta podataka i brzine. U MySQL-u će koristiti viševrednosnu sintaksu ubacivanja.

$values = [
  [
    'title' => 'Example',
    'uid' => 1,
    'created' => \Drupal::time()->getRequestTime(),
  ],
  [
    'title' => 'Example 2',
    'uid' => 1,
    'created' => \Drupal::time()->getRequestTime(),
  ],
  [
    'title' => 'Example 3',
    'uid' => 2,
    'created' => \Drupal::time()->getRequestTime(),
  ],
];
$query = $connection->insert('mytable')->fields(['title', 'uid', 'created']);
foreach ($values as $record) {
  $query->values($record);
}
$query->execute();

U gornjem primeru tri upita za ubacivanje će biti izvršena zajedno kao jedna celina, koristeći najefikasniji metod za konkretni drajver baze podataka. Obratite pažnju da smo sačuvali objekat upita u promenljivoj kako bismo mogli u petlji da pozivamo values() za svaki od $values.

U degenerisanom slučaju, gornji primer je ekvivalent sledeća tri upita:

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

Obratite pažnju da u slučaju višestrukog ubacivanja vraćena vrednost execute() nije definisana i ne treba joj se verovati, jer može varirati u zavisnosti od drajvera baze podataka.

Ubacivanje po rezultatima select upita

Ako želite da popunite tabelu rezultatima iz drugih tabela, morate ili da napravite SELECT nad izvornih tabela, iterirate podatke u PHP-u i ubacite ih u novu tabelu, ili da izvršite INSERT INTO ... SELECT FROM upit u kome se svaki zapis dobijen iz SELECT upita prosleđuje u INSERT upit.

U ovom primeru želimo da kreiramo tabelu mytable koja sadrži nid i korisničko ime za sve čvorove u sistemu koji su tipa page.

<?php
// Kreiranje SELECT upita.
$query = $connection->select('node', 'n');
// Pridruživanje tabeli users.
$query->join('users', 'u', 'n.uid = u.uid');
// Dodavanje polja koja želimo.
$query->addField('n','nid');
$query->addField('u','name');
// Dodavanje uslova da se dobiju samo page čvorovi.
$query->condition('type', 'page');

// Izvršavanje ubacivanja.
$connection->insert('mytable')
  ->from($query)
  ->execute();
?>

Podrazumevane vrednosti

U normalnim okolnostima, ako ne navedete vrednost za određeno polje, a podrazumevana vrednost je definisana u šemi tabele, baza će automatski ubaciti tu podrazumevanu vrednost umesto vas. Međutim, u nekim slučajevima morate eksplicitno reći bazi da koristi podrazumevanu vrednost. To uključuje situacije kada želite da koristite sve podrazumevane vrednosti za ceo zapis. Da biste eksplicitno rekli bazi da koristi podrazumevanu vrednost za određeno polje, postoji metod useDefaults().

$query->useDefaults(['field1', 'field2']);

Ova linija kaže upitu da koristi definisane podrazumevane vrednosti za polja field1 i field2. Obratite pažnju da je greška ako istovremeno navedete isto polje u useDefaults() i u fields() ili values(), i da će u tom slučaju biti bačena izuzetka.

$connection->insert() ili $connection->query()

Ovo je često postavljano pitanje. (Pogledajte komentare na ovoj stranici.) Koja je razlika između insert() i query()?

U metodu insert() svaki kolona je navedena kao poseban unos u nizu polja, i kod može da sanitizuje vrednost svake kolone. Metod query() prihvata SQL string bez mogućnosti proveravanja pojedinačnih kolona. Ako koristite query() sa placeholder-ima, kod može proveravati vrednosti kolona, ali placeholderi su samo opcija i nema načina da se garantuje da vaš SQL ne sadrži vrednosti koje nisu prošle kroz placeholder-e.

insert() prosleđuje upit kroz set hook-ova da bi omogućio drugim modulima da provere i izmene vaše upite. Ovo je pravi način da se radi sa drugim modulima. query() je nešto brži jer ne prosleđuje upit kroz hook-ove. Možete uštedeti vreme obrade, ali vaš kod neće dozvoliti drugim modulima da pomognu vašem kodu.

insert() češće funkcioniše sa drugim bazama podataka i budućim verzijama Drupala.

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.