Baza danych CodeIgniter: konfiguracja, edycja, aktualizacja, usuwanie danych

Baza Codeignitera

W poprzednim samouczku omówiliśmy podstawy aktywnego rekordu w CodeIgniter oraz sposoby wstawiania, aktualizowania, usuwania i odczytywania rekordów z bazy danych. W tym samouczku utworzymy modele baz danych i użyjemy formularzy do tworzenia i aktualizowania rekordów bazy danych. jeśli nie masz doświadczenia w pracy z bazami danych w CodeIgniter, zalecamy przeczytanie poprzedniego samouczka

Konfiguracja bazy danych Codeignitera

Zaczniemy od utworzenia bazy danych projektu samouczka. Utworzymy prostą bazę danych do zarządzania danymi kontaktowymi. Utworzymy prostą bazę danych z dwiema (2) tabelami o nazwach pals i cities, w których mieszkają. Relacja między pals i cities jest typu jeden do jednego, przy czym id w cities jest kluczem podstawowym, a city_id jest kluczem obcym w tabelach pals.

Uruchom następujące skrypty, aby utworzyć bazę danych:

CREATE TABLE `pals` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `city_id` int(11) DEFAULT NULL,
  `contact_name` varchar(245) DEFAULT NULL,
  `contact_number` varchar(245) DEFAULT NULL,
  `email_address` varchar(245) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

Stwórzmy teraz tabelę miast

CREATE TABLE `cities` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(245) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ;

Modele baz danych CodeIgnitera

Stworzymy teraz modele dla naszej bazy danych. Model jest częścią M MVC. Model dotyczy dostępu do danych, manipulacji danymi i logiki biznesowej.

W CodeIgniter każdy model musi zdefiniować metody, które będzie obsługiwał. Zamiast powtarzać ten sam kod w każdym modelu, skorzystamy z dziedziczenia w programowaniu obiektowym i utworzymy nadrzędną klasę modelu, która zdefiniuje podstawowe metody, które chcemy, aby nasze modele obsługiwały.

Poniższa tabela przedstawia metody, które zdefiniujemy oraz sposób dostępu do danych.

S / N Metoda wykonania Opis
1 __zbudować Definiuje metodę konstruktora, która wywołuje metodę konstruktora nadrzędnego
2 get_all Pobiera wszystkie pola i rekordy z bazy danych bez żadnych warunków
3 get_by_id Pobiera pojedynczy wiersz z bazy danych przy użyciu klucza podstawowego typu INT o nazwie id
4 dostać_gdzie Pobiera wszystkie pola z bazy danych na podstawie kryteriów opartych na
5 wstawić Wstawia nowy rekord do bazy danych
6 aktualizacja Aktualizuje istniejący rekord bazy danych w oparciu o klucz podstawowy typu INT o nazwie id
7 usunąć Usuwa istniejący rekord z bazy danych na podstawie klucza podstawowego typu INT o nazwie id

Poniższy obraz pokazuje diagram klas i sposób, w jaki modele podrzędne Pals i Cities odnoszą się do modelu nadrzędnego BaseModel.

Modele baz danych CodeIgnitera

Stworzymy dwa modele zgodnie z opisem na powyższym obrazku

Utwórz nową klasę BaseModel w application/models/BaseModel.php

Dodaj następujący kod

<?php

class BaseModel extends CI_Model {

    protected $table = '';

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

    public function get_all() {
        return $this->db->get($this->table)
                        ->result();
    }

    public function get_by_id($id) {
        return $this->db->get_where($this->table, array('id' => $id))
                        ->row();
    }

    public function get_where($where) {
        return $this->db->where($where)
                        ->get($this->table)
                        ->result();
    }

    public function insert($data) {
        return $this->db->insert($this->table, $data);
    }

    public function update($id, $data) {
        $this->db->where('id', $id);
        $this->db->update($this->table, $data);
    }

    public function delete($id) {
        $this->db->where('id', $id);
        $this->db->delete($this->table);
    }
}

TUTAJ,

  • chroniony $tabela = ”; definiuje chronioną zmienną o nazwie table. Zostanie ono wypełnione przez odpowiednią klasę podrzędną, aby określić, z którą tabelą powinny współdziałać nasze metody klasy modelu podstawowego.
  • funkcja publiczna __construct() {…} definiuje metodę konstruktora i wykonuje metodę konstruktora klasy nadrzędnej CI_Model.
  • get_all() {…} używa biblioteki bazy danych i wartości zmiennej $table do uruchomienia zapytania SELECT względem naszej bazy danych.
  • get_by_id($id) {…} definiuje sposób pobrania pojedynczego wiersza z bazy danych i akceptuje parametr $id, który powinien być typu danych INT.
  • get_where($where) {…} definiuje metodę get, która pozwala ustawić klauzulę Where.
  • wstaw($data) {…} definiuje metodę wstawiania i akceptuje parametr tablicowy $data, który zawiera wartości do zapisania do bazy danych.
  • update($id, $data) {…} definiuje metodę aktualizacji i akceptuje parametr tablicowy $data zawierający wartości, które mają zostać zaktualizowane w bazie danych.
  • Delete($id) {…} definiuje metodę usuwania, która akceptuje parametr $id, który powinien być typu danych INT.

teraz, gdy skończyliśmy z klasą modelu nadrzędnego, utwórzmy nasze modele Pals

Utwórz nowy plik w application/models/Pals.php

Dodaj następujący kod

<?php

class Pals_model extends BaseModel {

    protected $table = 'pals';

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

    public function get_by_id($id) {
        $this->db->where('pals.id', $id);
        $this->db->select('pals.*,cities.name');
        $this->db->from('pals');
        $this->db->join('cities', 'pals.city_id = cities.id');
        $query = $this->db->get();
        return $query->row();
    }

    public function get_all() {
        $this->db->select('pals.*,cities.name');
        $this->db->from('pals');
        $this->db->join('cities', 'pals.city_id = cities.id');
        $query = $this->db->get();
        return $query->result();
    }
}

TUTAJ,

  • class Pals Extends BaseModel {…} rozszerza model nadrzędny BaseModel i automatycznie udostępnia wszystkie metody zdefiniowane w BaseModel klasie podrzędnej.
  • chroniony $table = 'kumple'; definiuje nazwę tabeli związaną z naszym modelem nadrzędnym
  • __construct() {…} inicjuje konstruktor nadrzędny
  • funkcja publiczna get_by_id($id) {…} zastępuje get_by_id, aby zapewnić niestandardową implementację specyficzną dla modelu Pals. Zapytanie get_by_id używa sprzężenia w celu pobrania nazwy miasta z tabeli miast
  • funkcja publiczna get_all() {…} zastępuje metodę get_all, aby zaimplementować zapytanie łączące między znajomymi a tabelą miast

Utwórz nowy plik w application/models/Cities.php

<?php
class Cities extends BaseModel {
    protected $table = 'cities';
    
    public function __construct() {
        parent::__construct();
    }
}

TUTAJ,

chroniony $table = 'miasta'; definiuje tabelę bazy danych modelu.

Jak widać z powyższego kodu, Inheritance oszczędza nam mnóstwo czasu podczas pracy z modelami w CodeIgniter. W następnej części dowiemy się

Kontrolery menedżera kontaktów

Teraz, gdy stworzyliśmy modele, utwórzmy kontrolery dla naszej aplikacji. Będziemy mieć dwóch kontrolerów, a mianowicie Kontakty i Miasta

Zacznijmy od miast

Utwórz nowy plik Cities.php w katalogu application/controllers

Dodaj następujący kod

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Cities extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->helper('url', 'form');
        $this->load->library('form_validation');
        $this->load->model('cities_model');
    }

    public function index() {
        $header['title'] = 'Cities Listing';
        $data['pals'] = $this->cities_model->get_all();

        $this->load->view('header',$header);
        $this->load->view('cities/index', $data);
        $this->load->view('footer');
    }

    public function create() {
        $header['title'] = 'Create City';
        
        $this->load->view('header',$header);
        $this->load->view('cities/create');
        $this->load->view('footer');
    }

    public function store() {
        $rules = array(
            array(
                'field' => 'name',
                'label' => 'City Name',
                'rules' => 'required'
            )
        );

        $this->form_validation->set_rules($rules);

        if ($this->form_validation->run() == TRUE) {
            $data = array('name' => $this->input->post('name'));
            $this->cities_model->insert($data);

            redirect(base_url('cities'));
        } else {
            $header['title'] = 'Create City';
            
            $this->load->view('header',$header);
            $this->load->view('cities/create');
            $this->load->view('footer');
        }
    }

    public function edit($id) {
        $header['title'] = 'Edit City';
        $data['city'] = $this->cities_model->get_by_id($id);

        $this->load->view('header', $header);
        $this->load->view('cities/edit', $data);
        $this->load->view('footer');
    }

    public function update($id) {
        $rules = array(
            array(
                'field' => 'name',
                'label' => 'City Name',
                'rules' => 'required'
            )
        );

        $this->form_validation->set_rules($rules);

        if ($this->form_validation->run() == TRUE) {
            $data = array('name' => $this->input->post('name'));
            $this->cities_model->update($id,$data);

            redirect(base_url('cities'));
        } else {
            $header['title'] = 'Edit City';
            $data['city'] = $this->cities_model->get_by_id($id);
            
            $this->load->view('header',$header);
            $this->load->view('cities/create',$data);
            $this->load->view('footer');
        }
    }

    public function delete($id) {
        $header['title'] = 'Delete City';
        $data['city'] = $this->cities_model->get_by_id($id);

        $this->load->view('header', $header);
        $this->load->view('cities/delete', $data);
        $this->load->view('footer');
    }

    public function destroy($id) {
        $this->cities_model->delete($id);

        redirect(base_url('cities'));
    }
}

TUTAJ,

Powyższy kod implementuje wszystkie metody potrzebne do tworzenia, aktualizowania, usuwania i odczytywania wierszy z bazy danych.

Utwórz kolejny plik Contacts.php w aplikacji/kontrolerach

Dodaj następujący kod

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Contacts extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->helper('url', 'form');
        $this->load->library('form_validation');
        $this->load->model('pals_model');
    }

    public function index() {
        $header['title'] = 'Contacts List';
        $data['pals'] = $this->pals_model->get_all();

        $this->load->view('header', $header);
        $this->load->view('contacts/index', $data);
        $this->load->view('footer');
    }

    public function create() {
        $this->load->model('cities_model');
        $header['title'] = 'Create Contact';
        $data['cities'] = $this->cities_model->get_all();

        $this->load->view('header', $header);
        $this->load->view('contacts/create', $data);
        $this->load->view('footer');
    }

    public function store() {
        $rules = array(
            array(
                'field' => 'contact_name',
                'label' => 'Contact Name',
                'rules' => 'required'
            ),
            array(
                'field' => 'contact_number',
                'label' => 'Contact Number',
                'rules' => 'required',
                'errors' => array(
                    'required' => 'You must provide a %s.',
                ),
            ),
            array(
                'field' => 'email_address',
                'label' => 'Email Address',
                'rules' => 'required'
            ),
            array(
                'field' => 'city_id',
                'label' => 'City',
                'rules' => 'required'
            )
        );

        $this->form_validation->set_rules($rules);

        if ($this->form_validation->run() == FALSE) {
            $this->load->model('cities_model');
            $header['title'] = 'Create Contact';
            $data['cities'] = $this->cities_model->get_all();

            $this->load->view('header', $header);
            $this->load->view('contacts/create', $data);
            $this->load->view('footer');
        } else {
            $data = array(
                'city_id' => $this->input->post('city_id'),
                'contact_name' => $this->input->post('contact_name'),
                'contact_number' => $this->input->post('contact_number'),
                'email_address' => $this->input->post('email_address'),
            );

            $this->pals_model->insert($data);

            redirect(base_url('contacts'));
        }
    }

    public function edit($id) {
        $this->load->model('cities_model');
        $header['title'] = 'Edit Contact';
        $data['cities'] = $this->cities_model->get_all();

        $data['pal'] = $this->pals_model->get_by_id($id);
 
        $this->load->view('header', $header);
        $this->load->view('contacts/edit', $data);
        $this->load->view('footer');
    }

    public function update($id) {
        $rules = array(
            array(
                'field' => 'contact_name',
                'label' => 'Contact Name',
                'rules' => 'required'
            ),
            array(
                'field' => 'contact_number',
                'label' => 'Contact Number',
                'rules' => 'required',
                'errors' => array(
                    'required' => 'You must provide a %s.',
                ),
            ),
            array(
                'field' => 'email_address',
                'label' => 'Email Address',
                'rules' => 'required'
            ),
            array(
                'field' => 'city_id',
                'label' => 'City',
                'rules' => 'required'
            )
        );

        $this->form_validation->set_rules($rules);

        if ($this->form_validation->run() == FALSE) {
            $this->load->model('cities_model');
            $header['title'] = 'Create Contact';
            $data['cities'] = $this->cities_model->get_all();

            $data['pal'] = $this->pals_model->get_by_id($id);

            $this->load->view('header', $header);
            $this->load->view('contacts/edit', $data);
            $this->load->view('footer');
        } else {
            $data = array(
                'city_id' => $this->input->post('city_id'),
                'contact_name' => $this->input->post('contact_name'),
                'contact_number' => $this->input->post('contact_number'),
                'email_address' => $this->input->post('email_address'),
            );

            $this->pals_model->update($id, $data);

            redirect(base_url('contacts'));
        }
    }

    public function delete($id) {
        $this->load->model('cities_model');
        $header['title'] = 'Delete Contact';
        $data['cities'] = $this->cities_model->get_all();

        $data['pal'] = $this->pals_model->get_by_id($id);

        $this->load->view('header',$header);
        $this->load->view('contacts/delete',$data);
        $this->load->view('footer');
    }
    
    public function destroy($id){
        $this->pals_model->delete($id);
        
        redirect(base_url('contacts'));
    }
}

Widoki Menedżera kontaktów

Przyjrzeliśmy się już formularzom i walidacji w CodeIgniter w poprzednich tutorialach. Będziemy używać kodu, który opracowaliśmy w poprzednich tutorialach. Dla kompletności odtworzymy kod, który stworzyliśmy w poprzednich tutorialach.

Widoki naszej aplikacji będą następujące

Widoki Menedżera kontaktów

Możesz pobrać kod powyższych widoków, klikając link poniżej

Pobieranie menedżera kontaktów CodeIgniter

Podsumowanie

W tym samouczku dowiesz się, jak tworzyć modele w programie CodeIgniterSkorzystaliśmy z dziedziczenia w programowaniu obiektowym, aby promować ponowne wykorzystywanie kodu, tworząc model bazowy, który implementuje cztery główne operacje bazy danych: wstawianie, odczytywanie, aktualizowanie i usuwanie.

Zaprezentowaliśmy te koncepcje na przykładzie praktycznego zastosowania. W kolejnych samouczkach będziemy to kontynuować, dodając do aplikacji więcej funkcjonalności.