CodeIgniter - model i baza danych

Opublikowano:
W poprzednim wpisie dowiedziałeś się czym jest framework, MVC i jak działa controller w tym wzorcu. Dzisiaj zajmiemy się modelem i bazą danych w CodeIgniter.

Tutaj przeczytasz pierwszą część wprowadzenia do frameworku CodeIgniter.

Przypomnę, że na modelu spoczywa najwięcej pracy. To w nim wykonujemy wszystkie operacje oraz on odpowiada za komunikację z bazą danych, ale po kolei.
Jako przykładową aplikację wybrałem serwis w stylu samosia.pl - dlatego, że jest to bardzo prosty serwis, w którym można poruszyć wszystkie możliwości frameworka i dzięki temu wyborowi nie jest to kolejny tutorial, który uczy jak napisać swojego bloga.

Połączmy się z bazą danych.

Aby połączyć się z bazą danych w CodeIgniter należy edytować plik config/database.php. W danym pliku znajdziemy tablicę $db i kluczem default. Skopiuj cały klucz default i zmień mu nazwę np na development. Najważniejszymi pozycjami w tej tablicy są:

  • hostname - adres, gdzie znajduje się baza
  • username - nazwa użytkownika
  • password - hasło
  • database - nazwa bazy danych
  • dbdriver - typ połączenia - domyślnie mysqli
  • Ustaw je odpowiednio. U mnie dana tablica wygląda następująco:

    
    $db['development'] = array(
      'dsn'  => '',
      'hostname' => 'localhost',
      'username' => 'root',
      'password' => '',
      'database' => 'pytamy-sie',
      'dbdriver' => 'mysqli',
      'dbprefix' => '',
      'pconnect' => FALSE,
      'db_debug' => (ENVIRONMENT !== 'production'),
      'cache_on' => FALSE,
      'cachedir' => '',
      'char_set' => 'utf8',
      'dbcollat' => 'utf8_general_ci',
      'swap_pre' => '',
      'encrypt' => FALSE,
      'compress' => FALSE,
      'stricton' => FALSE,
      'failover' => array(),
      'save_queries' => TRUE
    );

    Resztę ustawień zostawiamy, domyślnie. Zajmiemy się nimi w dalszych częściach kursu o programowaniuw frameworku CodeIgniter.

    Teraz należy wybrać połączenie z jakiego będziemy korzystać. W zmiennej active_group, ustaw nazwę połączenia, taką jak klucz, w którym wpisałeś dane do połączenia z bazą danych. U mnie jest to development.

    Kolejnym krokiem, jest automatyczne uruchamianie połączenia z bazą danych, w tym celu otwórz plik config/autoload.php.
    Ze względu na swoją lekkość i szybkość w CodeIgniter domyślnie ładowane są tylko najważniejsze rzeczy i w tym pliku definiujemy, co chcemy dodatkowo załadować za każdym razem w naszej aplikacji.

    Plik autoloader’a jest także zwykłą array’ką z odpowiednimi kluczami. Nas teraz interesuje klucz Libraries, ponieważ chcemy za każdym razem ładować bibliotekę obslugującą bazę danych. Odszukaj klucza libraries i przypisz do tego klucza, tablicę z elementem ‘database’.

    Stwórzmy pierwszą tabelę

    Na sam początek coś bardzo łatwego, czyli kategorie. Kategorie występują wszędzie, w blogach, FAQ, sklepach oraz w serwisie z pytaniami jaki tworzymy.

    Kategorie mają swoje subkategorie, kolejność, nazwę, slug oraz czy ma być wyświetlana - tyle nam wystarczy na sam początek. Oto sql, która stworzy dla nas taką tabelę:

    
    CREATE TABLE `pytamy-sie`.`categories` (
      `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
      `name` VARCHAR(150) NOT NULL ,
      `slug` VARCHAR(150) NOT NULL ,
      `order` INT(3) NULL,
      `parent` INT NULL,
      `display` INT(1) NULL DEFAULT 1,
      PRIMARY KEY (`id`));
    

    Uzupełnij sobie tabelę przykładowymi danymi i przechodzimy do modelu.

    Czas na model.

    w modelu tylko pobierzemy sobie tylko dane . Dodawanie, edycję oraz usuwanie zostawię na kolejny wpis, gdzie pokażę od razu obsługę formularzy w CodeIgniter.

    Przy tworzeniu modeli należy zastosować spójne nazwnictwo, dzięki czemu unikniemy późniejszych problemów z zapanowaniem nad kodem. Ja stosuje nazwenictwa na zasadzie:
    nazwa tabel - liczba mnoga zawartości
    nazwa modelu = nazwa tabeli
    nazwa controllera = liczba pojedyncza zawartości

    Więc stwórzmy sobie model Categories i w nim metodę test(), która zwraca nam jakiś testowy tekst. Klasa dziedziczy po CI_Model. Oto mój plik:

    
    class Categories extends CI_Model
    {
      public function test(){
         return 'testuje model';
      }
    }
    

    Teraz stwórz sobie controller category.php i w nim jakąś akcję. W tej akcji załadujemy model oraz wywołamy funkcję test().

    
    $this->load->model('categories');
    var_dump($this->categories->test()); exit;
    

    Jak widzisz, załadowanie modelu jest bardzo proste. Odwołujemy się do loadera i metodą model ładujemy odpowiedni model. Następnie mamy dostęp do danego modelu przez zmienną categories zawierającą naszą klasę. Oczywiście, jeśli używamy już gdzieś categories (np jako biblioteka) to możemy zmienić nazwę za pomocą, której będziemy odwoływać się do modelu. Dla przykładu chcemy, zamiast categories pisać foo:

    $this->load->model('categories',’foo’);
    var_dump($this->foo->test()); exit;
    

    Active record

    Czyli budujemy zapytania do bazy danych. Nie chcę przepisywać także całej dokumentacji, dlatego przedstawię Ci tutaj same podstawy, a po więcej informacji odsyłam do dokumentacji.

    Active record jest biblioteką, ułatwiającą budowanie nam zapytań do bazy danych i w zdecydowanej większości przypadków będziemy wykorzystywać właśnie tą bibliotekę.
    Zaczniemy od czegoś prostego. Pobierzemy sobie wszystkie kategorie jakie mamy w bazie i zwrócimy je jako tablicę obiektów.

    
    public function findAll() { 
      $query = $this->db->select( '*' )->get( 'categories' );
      return $query->result();
    } 
    

    Jeśli jednak wolisz dostać wynik jako tablicę, to wykonaj zwróć wynik z $query->result_array();.

    I tutaj czas na zadanie domowe.
    • Przerób powyższą metodę, aby zwracała tylko te rekordy, które są widoczne (display == 1) oraz posortowane po polu order
    • Dodatkowo powyższa funkcja powinna zawierać parametr z id rodzica, według którego pobierasz rekordy (parent == null to główne kategorie)
    • Po wykonaniu dwóch powyższych zadań zmień nazwę metody na coś sensownego np find( $parent = null)

    Na dziś to koniec. W następnym wpisie, powrócimy do active record oraz zaczniemy obsługiwać formularze.