Podręcznik użytkownika CodeIgniter wersja 2.2.1


Modele

Modele są dostępne opcjonalnie dla tych osób, które chcą używać bardziej tradycyjnego podejścia MVC.

Czym jest model?

Modele są klasami PHP, które są zaprojektowane do pracy z informacjami w bazie danych. Dla przykładu powiedzmy, że Twój CodeIgniter zarządza blogiem. Możesz mieć klasę modelu, która zawiera funkcje do dodawania, aktualizacji i pobierania danych z bloga. Tutaj mamy przykład jak taki model może wyglądać:

class Blogmodel extends CI_Model {

    var $title   = '';
    var $content = '';
    var $date    = '';

    function __construct()
    {
        // Wywołanie konstuktora modelu
        parent::__construct();
    }
    
    function get_last_ten_entries()
    {
        $query = $this->db->get('entries', 10);
        return $query->result();
    }

    function insert_entry()
    {
        $this->title   = $_POST['title']; // przeczytaj uwagę poniżej
        $this->content = $_POST['content'];
        $this->date    = time();

        $this->db->insert('entries', $this);
    }

    function update_entry()
    {
        $this->title   = $_POST['title'];
        $this->content = $_POST['content'];
        $this->date    = time();

        $this->db->update('entries', $this, array('id' => $_POST['id']));
    }

}

Uwaga: Funkcje modelu w powyższym przykładzie używają biblioteki Active Record.

Uwaga: Dla uproszczenia w tym przykładzie używamy bezpośrednio zmiennych typu $_POST. Generalnie jest to zła praktyka i bardziej rozsądnym podejściem byłoby wykorzystanie klasy Input $this->input->post('title')

Anatomia modelu

Klasy modelu znajdują się w katalogu application/models/. Mogą znajdować się w podkatalogach, jeśli tylko taki typ organizacji nam odpowiada.

Podstawowy prototyp klasy modelu wygląda w ten sposób:

class Nazwa_modelu extends CI_Model {

    function __construct()
    {
        parent::__construct();
    }
}

Gdzie Nazwa_modelu jest nazwą klasy. Nazwy klas muszą mieć pierwszą literę nazwy pisaną dużą literą, natomiast resztę małymi literami. Upewnij się, że twoja klasa rozszerza klasę modelu bazowego.

Nazwa pliku, będzie odpowiednikiem nazwy Twojej klasy pisanej małymi literami. Dla przykładu, jeśli Twoja klasa to:

class Nazwa_modelu extends CI_Model {

    function __construct()
    {
        parent::__construct();
    }
}

Twój plik będzie miał nazwę:

application/models/nazwa_modelu.php

Ładowanie modeli

Twoje modele będą zazwyczaj ładowane i wywoływane z funkcji Twojego kontrolera. Aby załadować model będziemy musieli użyć następującej metody:

$this->load->model('Nazwa_modelu');

Jeśli Twój model znajduje się w podkatalogu, należy dodać relatywną ścieżkę do tego folderu. Dla przykładu, jeśli jeśli Twój model znajduje się w katalogu application/models/blog/queries.php, będziemy go ładować w ten sposób:

$this->load->model('blog/queries');

Po jednorazowym załadowaniu, będziemy mieli dostęp do funkcji modelu za pośrednictwem obiektu, o tej samej nazwie co Twoja klasa:

$this->load->model('Nazwa_modelu');

$this->Nazwa_modelu->funkcja();

Jeśli chcielibyśmy przypisać model do innej nazwy obiektu, możemy to zrobić za pomocą drugiego parametru metody odpowiedzialnej za ładowanie modelu:

$this->load->model('Nazwa_modelu', 'fubar');

$this->fubar->funkcja();

Tutaj mamy przykład kontrolera, który ładuje model i wyświetla widok:

class Blog_controller extends CI_Controller {

    function blog()
    {
        $this->load->model('Blog');

        $data['query'] = $this->Blog->get_last_ten_entries();

        $this->load->view('blog', $data);
    }
}

Automatyczne ładowanie modeli

Jeśli okaże się, że potrzebujesz konkretnego modelu globalnie, w obrębie całej aplikacji, możesz nakazać CodeIgniterowi, aby ładował dany model w trakcie inicjalizacji systemu. Można to wykonać poprzez edycję pliku application/config/autoload.php i dodanie modelu do tablicy autoładowania.

Połączenie z bazą danych

To, że model jest załadowany NIE oznacza, że automatycznie ustanawiane jest połączenie z bazą danych. Oto opcje, które są dostępne, podczas definiowania połączenia: