RkBlog

Hardware, programming and astronomy tutorials and reviews.

Bazy Danych - Active Records

Obsługa baz danych w CI za pomocą wzorca Active Recors ułatwiającego operowanie na danych zapisanych w bazie danych aplikacji

Połączenie z bazą danych ustawiamy w application/config/database.php. Znajdziemy w nim:
$db['default']['hostname'] = "localhost"; // host bazy danych
 $db['default']['username'] = "root"; // login, nazwa użytkownika
 $db['default']['password'] = ""; // hasło do bazy danych
 $db['default']['database'] = "database_name"; // nazwa bazy danych
 $db['default']['dbdriver'] = "mysql"; // sterownik: mssql, mysql, mysqli (PHP5 mysql), odbc, postgre, sqlite
 $db['default']['dbprefix'] = "kurs"; // prefiks table
 $db['default']['pconnect'] = FALSE; // Czy używać trwałych połączeń
 $db['default']['db_debug'] = FALSE; // czy pokazywać komunikaty błędów
 $db['default']['active_r'] = TRUE; // czy załadować klasę Active Records
Podajemy dane naszej bazy. Jeżeli mamy PHP5 i moduł MySQLi to możemy skorzystać ze sterownika "mysqli" do połączenia się z bazą MySQL (szybszy i lepszy). "pconnect" raczej wyłączone (FALSE), db_debug można włączyć na lokalnym serwerze w czasie tworzenia/testowania. Active Records - zapewne tak bo będziemy z niego korzystać (chyba że lubisz SQL)
Następnie przechodzimy do pliku autoload.php i dodajemy "database" do automatycznego ładowania: $autoload['libraries'] = array('database');

Słownictwo

Rekord, wpis, wiersz - jeden "wpis" w tabeli. Np. wpis to dane jednego użytkownika w tabeli użytkowników.
Kolumna, pole - określa element w tabeli np. "nazwa użytkownika", "hasło", "strona domowa" to przykładowe pola/kolumny w tabeli użytkowników
Zapytanie, kwerenda - wykonanie operacji na bazie danych - pobranie danych, usunięcie ich itd.
SQL - język w jakim komunikujemy się z bazą danych. Język ten różni się między bazami. O SQL możesz poczytać na wikipedii. Jeżeli interesują cię szczegóły SQL dla twojej bazy danych - zajrzyj do dokumentacji tejże bazy.

Active Records - wersja Code Ignitera

Active Records to pośrednik między naszymi operacjami w bazie danych a wynikowymi zapytaniami SQL. Nie korzystamy z języka SQL - używamy specjalnych metod wykonujących określone czynności w bazie. Z poprzedniego artykułu o modelach wiesz że to w nich przechowuje się kod operujący na bazie danych. W nich powinniśmy (możemy też w kontrolerach) umieścić kod odpowiedzialny za operacje na naszej bazie.

Przegląd metod Active Records

Pobranie danych
$this->db->get('nazwa tabeli');
$this->db->get('nazwa tabeli', LIMIT);
$this->db->get('nazwa tabeli', LIMIT, OFSET);
Metoda ta pobierze wszystkie wpisy z podanej tabeli. Można też jako drugi parametr podać limit wyników (LIMIT) lub też Limit i Ofset (np. pobierze 10 wyników ale nie 10 pierwszych tylko zaczynając od 5 (ofset to 5).
Warunek WHERE
$this->db->where('nazwa kolumny', wartość);
Określi warunek "WHERE" limitujący wyniki - pobrane zostaną tylko te rekordy (wpisy z bazy danych), które spełniają ten warunek. Można kilka razy zastosować tą metodą dla uzyskania łączonego warunku where. Lub też można zastosować tablicę asocjacyjną:
$array = array('pole' => $wartosc, 'pole2' => $wartosc2, 'pole' => $wartosc);
$this->db->where($array);
By uzyskać warunki łączone przez "lub" wystarczy użyć metody "orwhere":
$this->db->orwhere(takie same parametry);
Pobieranie określonych kolumn
$this->db->select('pole, pole2, pole3');
Pozwala na pobranie wartości tylko z określonych pól podanych jako argument. Podajemy nazwy pól oddzielone przecinkami. Jeżeli nie potrzebujemy danych ze wszystkich pól to powinniśmy zastosować tą metodę (mniej danych do pobrania - mniejsze obciążenie bazy danych, szybszy skrypt). LIKE - pobieranie wierszy zawierający podany podłańcuch
$this->db->like('pole', 'wartość');
Operator LIKE w SQL pozwala na wybranie wpisów, zawierających w określonym polu podany "podłańcuch". Np. jeżeli jako wartość podamy "kot" to warunek spełniony byłby dla "koty", "okota" - wszystkie łańcuchy zawierające podany podłańcuch. Metoda like ma takie same opcje z argumentami (tablice też może być) jak where. Istnieje też metoda orlike łącząca warunki przez "lub"
Sortowanie wyników
$this->db->orderby('pole', 'desc lub asc');
"desc" posortuje malejąco a "asc" rosnąco.
Limit wyników
$this->db->limit(Limit);
Limit można także określić oddzielnie za pomocą tej metody

Dodawanie wpisu
$dane = array('pole' => wartość, 'pole2' => wartość);
$this->db->insert('tabela', $dane); 
Metoda insert dodaje wpis do bazy danych. Przyjmuje ona jako parametr nazwę tabeli oraz tablicę asocjacyjną lub obiekt z danymi. Tablica jako klucze musi zawierać nazwy pól a jako ich wartości - te wartości, które mają być dodane do bazy.
Zmiana wpisu
$this->db->update('tabela', $dane);
Parametry jak dla "insert". Modyfikuje wpisy nowymi danymi, zazwyczaj towarzyszy jej warunek WHERE do modyfikacji określonego wpisu.
Kasowanie wpisów
$this->db->delete('tabela', array('pole' => wartość, 'pole' => wartość));
Kasuje wpisu, dla których podane pola w tablicy spełniają warunek
Łączenie tabel - JOIN
$this->db->select('*');
 $this->db->from('tabela1');
 $this->db->join('tabela2', 'tabela2.pole = tabela1.pole');
 $query = $this->db->get();
Pozwala połączyć wyniki z dwóch zależnych tabel. O tym powiemy nieco później.

Przykładowy model

Oto kod przykładowe modelu modułu news, który zaraz pojawi się w Warsztacie:
<?php
class News extends Model
{
function News()
 {
 parent::Model();
 }
function get_news()
 {
 // Wszystkie newsy sortowane malejąco po news_id
 $this->db->orderby("news_id", "desc");
 return $this->db->get('news');
 }
function add_news($data)
 {
 // dodanie newsa
 return $this->db->insert('news', $data);
 }
function update_news($id, $data)
 {
 // zmiana newsa o podanym numerze news_id
 $this->db->where('news_id', $id);
 return $this->db->update('news', $data);
 }
function delete_news($id)
 {
 // skasowanie newsa o podanym news_od
 $this->db->where('news_id', $id);
 return $this->db->delete('news');
 }
 }
Zero kodu SQL, niezależność od baz danych (czy to MySQL czy PostgreSQL kod będzie działał), automatyczne zabezpieczanie danych przed atakami SQL Injection. Wadą jest małe możliwości (złożone zapytania trzeba pisać w SQL).
Kod modelu odnosi się do tabeli utworzonej poleceniem SQL:
CREATE TABLE `kurs_news` (
  `news_id` smallint(5) unsigned NOT NULL auto_increment,
  `news_title` varchar(255) default NULL,
  `news_text` text,
  `news_date` int(10) unsigned NOT NULL,
  PRIMARY KEY  (`news_id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 ;
RkBlog

14 July 2008;

Comment article