9.13. Rad sa bazom podataka u Drupalu
Ovo je čest slučaj prilikom razvoja Drupal modula. Trebalo bi koristiti entityQuery gde je to moguće, ali ponekad je potrebno koristiti SQL upite za dobijanje složenijih podataka.
Možete dodati ovu stranicu u omiljene kako biste uvek imali kod za brzo podsećanje kako izvršavati MySQL upite select, insert, update, delete u Drupalu.
Select
Dobijanje jedne vrednosti:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->addField('n', 'nid');
$query->condition('n.title', 'About Us');
$query->range(0, 1);
$nid = $query->execute()->fetchField();
Dobijanje zapisa kao asocijativnog niza:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->range(0, 1);
$vegetable = $query->execute()->fetchAssoc();
Takođe možete koristiti ->fetchObject(), ->fetchAll() za dobijanje zapisa kao objekat.
Korišćenje LIKE u upitu:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->condition('n.type', 'page');
$query->condition('n.title', $query->escapeLike('About') . '%', 'LIKE');
$vegetable = $query->execute()->fetchAllKeyed();
Select upit sa JOIN-om:
$query = \Drupal::database()->select('node_field_data', 'n');
$query->fields('n', ['nid', 'title']);
$query->addField('u', 'name');
$query->join('users_field_data', 'u', 'u.uid = n.uid');
$query->condition('n.type', 'page');
$vegetable = $query->execute()->fetchAllAssoc('nid');
U nastavku su primeri drugih baza upita: insert, update, upsert i delete. Ovi upiti mogu biti korisni za rad sa prilagođenim tabelama. Ali bolje je dvaput razmisliti pre korišćenja prilagođenih tabela. Bolje je koristiti Drupal API ili dopunske module. Ali ako ipak odlučite da pišete prilagođene upite za bazu, ispod su primeri:
Insert
$query = \Drupal::database()->insert('flood');
$query->fields([
'event',
'identifier'
]);
$query->values([
'My event',
'My indentifier'
]);
$query->execute();
Možete pozvati values() više puta da ubacite više zapisa odjednom.
Update
$query = \Drupal::database()->update('flood');
$query->fields([
'identifier' => 'My new identifier'
]);
$query->condition('event', 'My event');
$query->execute();
Upsert
$query = \Drupal::database()->upsert('flood');
$query->fields([
'fid',
'identifier',
]);
$query->values([
1,
'My indentifier for upsert'
]);
$query->key('fid');
$query->execute();
Metod key() treba da opisuje naziv polja koje će se koristiti za određivanje postojećeg zapisa. Nije potrebno pisati condition(), možete koristiti key() metod. Polje koje se koristi u key() metodu mora biti jedinstveno, na primer nid, uid, tid, fid ili drugi ID-jevi entiteta. Ako ključ ne postoji, umesto ažuriranja zapisa, biće ubačen novi zapis sa zadatim ključem.
Delete
$query = \Drupal::database()->delete('flood');
$query->condition('event', 'My event');
$query->execute();
To je sve. Ako vam treba još primera, pišite u komentarima. U narednim tutorijalima ćemo pogledati kako koristiti prilagođene Drupal baze upita u praksi.