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.

Podsumuj ten post nastฤ™pujฤ…co: