CodeBaza danych Igniter: konfiguracja, aktualizacja i usuwanie danych

โšก Inteligentne podsumowanie

CodeBaza danych Igniter tworzy modele i kontrolery dla menedลผera kontaktรณw obsล‚ugiwanego przez MySQLWspรณล‚dzielony BaseModel implementuje operacje wstawiania, odczytu, aktualizacji i usuwania, a modele podrzฤ™dne Pals i Cities dziedziczฤ… go, dziฤ™ki czemu kontrolery ponownie wykorzystujฤ… te same operacje bazy danych w caล‚ej aplikacji.

  • ๐Ÿ—„๏ธ Schemat: Dwie powiฤ…zane tabele, pals i cities, modelujฤ… relacjฤ™ jeden do jednego za pomocฤ… klucza obcego.
  • โš™๏ธ Config: Plik database.php ustanawia poล‚ฤ…czenie, a biblioteka bazy danych zostaje zaล‚adowana.
  • ๐Ÿงฌ Model bazowy: Model nadrzฤ™dny definiuje get_all, get_by_id, get_where, insert, update i delete.
  • ๐Ÿ‘จ๐Ÿ‘ฉ๐Ÿ‘ง Dziedzictwo: Pals i Cities rozszerzajฤ… BaseModel, dziฤ™ki czemu ponownie wykorzystujฤ… jego metody i nadpisujฤ… je tam, gdzie jest to potrzebne.
  • ๐Ÿ”— Doล‚ฤ…cza: Model Pals ล‚ฤ…czy miasta, aby pobraฤ‡ nazwฤ™ miasta wraz z danymi kontaktowymi.
  • ๐ŸŽ›๏ธ Kontrolery: Kontrolery Cities i Contacts ล‚ฤ…czฤ… ze sobฤ… modele, formularze i walidacjฤ™.
  • โ™ป๏ธ Ponowne uลผycie: Dziedziczenie pozwala na usuniฤ™cie powtarzajฤ…cego siฤ™ kodu CRUD i sprawia, ลผe โ€‹โ€‹modele stajฤ… siฤ™ cienkie.

CodeBaza danych Igniter

CodeBaza danych Igniter

W poprzednim samouczku omรณwiliล›my podstawy CodeIgniter Active Record i jak wstawiaฤ‡, aktualizowaฤ‡, usuwaฤ‡ i odczytywaฤ‡ rekordy z bazy danych. W tym samouczku utworzymy modele baz danych i uลผyjemy formularzy do tworzenia i aktualizowania rekordรณw w bazie danych. Jeล›li dopiero zaczynasz pracฤ™ z bazami danych, CodeZapล‚onniku, zaleca siฤ™ zapoznanie siฤ™ z poprzedni samouczek pierwszy.

CodeKonfiguracja bazy danych Igniter

Zaczniemy od utworzenia bazy danych projektu samouczka. Stworzymy prostฤ… bazฤ™ danych do zarzฤ…dzania danymi kontaktowymi, z dwiema tabelami o nazwach โ€žpalsโ€ i โ€žcitysโ€ (miasta, w ktรณrych mieszkajฤ…). Relacja miฤ™dzy tabelami โ€žpalsโ€ i โ€žcitysโ€ jest jednoznaczna, z identyfikatorem w tabeli โ€žcitysโ€ jako kluczem podstawowym i โ€žcity_idโ€ jako kluczem obcym w tabeli โ€ž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`)
);

Utwรณrzmy teraz tabelฤ™ miast:

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

CodeModele bazy danych Igniter

Teraz utworzymy modele dla naszej bazy danych. Model jest czฤ™ล›ciฤ… M MVC. Model dotyczy dostฤ™pu do danych, manipulacji danymi i logiki biznesowej.

In CodeW Igniterze 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 klasฤ™ modelu nadrzฤ™dnego, ktรณra definiuje podstawowe metody, ktรณre nasze modele majฤ… obsล‚ugiwaฤ‡.

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 podanych kryteriรณw.
5 wstawiฤ‡ Wstawia nowy rekord do bazy danych.
6 aktualizacja Aktualizuje istniejฤ…cy rekord bazy danych na podstawie klucza podstawowego 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.

Diagram klas BaseModel z modelami Pals i Cities

Stworzymy dwa modele, jak opisano na powyลผszym obrazku. Utwรณrz nowฤ… klasฤ™ BaseModel w pliku application/models/BaseModel.php i 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:

  • protected $table = โ€; definiuje chronionฤ… zmiennฤ… o nazwie table. Jest ona wypeล‚niana przez odpowiedniฤ… klasฤ™ potomnฤ…, aby okreล›liฤ‡, z ktรณrฤ… tabelฤ… metody modelu bazowego powinny wchodziฤ‡ w interakcjฤ™.
  • publiczna funkcja __construct() {โ€ฆ} definiuje konstruktor i wykonuje konstruktor klasy nadrzฤ™dnej CI_Model.
  • get_all() {โ€ฆ} uลผywa biblioteki bazy danych i wartoล›ci $table do uruchomienia zapytania SELECT.
  • get_by_id($id) {โ€ฆ} pobiera pojedynczy wiersz i akceptuje parametr $id typu danych INT.
  • get_where($where) {โ€ฆ} definiuje metodฤ™ get umoลผliwiajฤ…cฤ… ustawienie klauzuli where.
  • insert($data) {โ€ฆ} akceptuje parametr tablicowy $data zawierajฤ…cy wartoล›ci, ktรณre majฤ… zostaฤ‡ zapisane w bazie danych.
  • update($id, $data) {โ€ฆ} akceptuje parametr tablicowy $data zawierajฤ…cy wartoล›ci przeznaczone do aktualizacji.
  • delete($id) {โ€ฆ} akceptuje parametr $id typu danych INT.

Skoro skoล„czyliล›my pracฤ™ z klasฤ… modelu nadrzฤ™dnego, utwรณrzmy model Pals. Utwรณrz nowy plik w aplikacji/models/Pals_model.php i 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:

  • klasa Pals_model rozszerza BaseModel {โ€ฆ} rozszerza model nadrzฤ™dny BaseModel i automatycznie udostฤ™pnia wszystkie jego metody klasie podrzฤ™dnej.
  • protected $table = 'pals'; definiuje nazwฤ™ tabeli skojarzonej z tym modelem.
  • __construct() {โ€ฆ} inicjuje konstruktor nadrzฤ™dny.
  • Funkcja publiczna get_by_id($id) {โ€ฆ} zastฤ™puje get_by_id, aby zapewniฤ‡ niestandardowฤ… implementacjฤ™. Zapytanie uลผywa sprzฤ™ลผenia, aby pobraฤ‡ nazwฤ™ miasta z tabeli โ€žcityโ€.
  • publiczna funkcja get_all() {โ€ฆ} zastฤ™puje get_all w celu zaimplementowania zapytania ล‚ฤ…czฤ…cego miฤ™dzy tabelami pals i cities.

Utwรณrz nowy plik w aplikacji/models/Cities_model.php:

<?php
class Cities_model extends BaseModel {
protected $table = 'cities';

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

Tutaj:

  • chroniony $table = 'miasta'; definiuje tabelฤ™ bazy danych modelu.

Jak widaฤ‡, dziedziczenie oszczฤ™dza nam mnรณstwo czasu podczas pracy z modelami w CodeZapalnik.

Kontrolery menedลผera kontaktรณw

Skoro stworzyliล›my juลผ modele, stwรณrzmy kontrolery dla naszej aplikacji. Bฤ™dziemy mieli dwa kontrolery: Cities i Contacts. Zacznijmy od Cities. Utwรณrz nowy plik Cities.php w katalogu application/controllers i 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 folderze application/controllers i 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 samouczkach i wykorzystamy opracowany tam kod. Dla kompletnoล›ci, widoki naszej aplikacji bฤ™dฤ… wyglฤ…daฤ‡ nastฤ™pujฤ…co:

Widoki menedลผera kontaktรณw

Kod widokรณw moลผesz pobraฤ‡, klikajฤ…c poniลผszy link:

CodeWidoki menedลผera kontaktรณw Igniter do pobrania

FAQ

Model bazowy przechowuje wspรณล‚dzielone metody insert, read, update i delete tylko raz. Modele potomne dziedziczฤ… je i nadpisujฤ… tylko te, ktรณre siฤ™ rรณลผniฤ…, co eliminuje duplikaty i sprawia, ลผe โ€‹โ€‹kaลผdy model jest niewielki.

Kaลผdy kontakt przechowuje identyfikator miasta (city_id), a nie jego nazwฤ™. Nadpisanie ล‚ฤ…czy tabelฤ™ โ€žcityโ€, dziฤ™ki czemu zapytanie zwraca czytelnฤ… nazwฤ™ miasta obok kaลผdego kontaktu w jednym wyniku.

Kontroler ล‚aduje model, weryfikuje przesล‚any formularz i albo zapisuje dane i przekierowuje, albo ponownie wczytuje formularz z bล‚ฤ™dami. ลฤ…czy model, widoki i bibliotekฤ™ walidacyjnฤ….

Tak. Na podstawie definicji tabel, AI moลผe wygenerowaฤ‡ BaseModel z metodami CRUD i jednym modelem podrzฤ™dnym na tabelฤ™, dodajฤ…c nadpisania poล‚ฤ…czeล„ w miejscach, gdzie klucz obcy wymaga czytelnej etykiety. RevObejrzyj wygenerowane poล‚ฤ…czenia.

Biblioteka bazy danych udostฤ™pnia metody surowych zapytaล„ i Active Record. Model przeksztaล‚ca te wywoล‚ania w zrozumiaล‚e, wielokrotnego uลผytku operacje dla konkretnej tabeli.ping dostฤ™p do danych poza kontrolerem.

Podsumuj ten post nastฤ™pujฤ…co: