CodeIgniter-databas: Konfigurera, uppdatera och ta bort data

โšก Smart sammanfattning

CodeIgniter Database bygger modeller och kontroller fรถr en kontakthanterare som stรถds av MySQLEn delad BaseModel implementerar infoga, lรคsa, uppdatera och ta bort, och undermodellerna Pals och Cities รคrver den, sรฅ kontrollanter รฅteranvรคnder samma databasoperationer i hela applikationen.

  • ๐Ÿ—„๏ธ schema: Tvรฅ relaterade tabeller, pals och cities, modellerar en en-till-en-relation med hjรคlp av en frรคmmande nyckel.
  • โš™๏ธ config: database.php upprรคttar anslutningen och databasbiblioteket laddas.
  • ๐Ÿงฌ Basmodell: En fรถrรคldermodell definierar get_all, get_by_id, get_where, insert, update och delete.
  • ๐Ÿ‘จ๐Ÿ‘ฉ๐Ÿ‘ง Arv: Pals och Cities utรถkar BaseModel, sรฅ att de รฅteranvรคnder dess metoder och รฅsidosรคtter dรคr det behรถvs.
  • ๐Ÿ”— Gรฅr med: Pals-modellen kopplar samman stรคder fรถr att hรคmta stadens namn tillsammans med kontaktuppgifter.
  • ๐ŸŽ›๏ธ controllers: Stads- och kontaktkontrollanter kopplar samman modeller, formulรคr och validering.
  • โ™ป๏ธ ร…teranvรคndning: Arv tar bort upprepad CRUD-kod och hรฅller modellerna tunna.

CodeIgniter-databas

CodeIgniter-databas

I den fรถregรฅende handledningen gick vi igenom grunderna fรถr CodeIgniter Active Record och hur man infogar, uppdaterar, tar bort och lรคser poster frรฅn databasen. I den hรคr handledningen kommer vi att skapa databasmodeller och anvรคnda formulรคr fรถr att skapa och uppdatera databasposter. Om du รคr helt nybรถrjare pรฅ att arbeta med databaser i CodeTรคndare, rekommenderas att du lรคser tidigare handledning fรถrst.

CodeKonfiguration av Igniter-databas

Vi bรถrjar med att skapa handledningsprojektets databas. Vi kommer att skapa en enkel databas fรถr att hantera kontaktuppgifter, med tvรฅ tabeller med namnet pals och de stรคder de bor i. Relationen mellan pals och cities รคr ett-till-ett, med id i cities som primรคrnyckel och city_id som frรคmmande nyckel i pals-tabellen.

Kรถr fรถljande skript fรถr att skapa databasen:

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`)
);

Lรฅt oss nu skapa stรคder-tabellen:

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

CodeIgniter-databasmodeller

Vi ska nu skapa modeller fรถr vรฅr databas. Modellen รคr M-delen av MVC. Modellen behandlar dataรฅtkomst, datamanipulation och affรคrslogik.

In CodeIgniter, varje modell mรฅste definiera de metoder den ska stรถdja. Istรคllet fรถr att upprepa samma kod i varje modell kommer vi att dra nytta av arv i objektorienterad programmering och skapa en fรถrรคldermodellklass som definierar de grundlรคggande metoder vi vill att vรฅra modeller ska stรถdja.

Tabellen nedan visar de metoder som vi kommer att definiera och hur data kommer att nรฅs.

S / N Metod BESKRIVNING
1 __konstruera Definierar konstruktormetoden som anropar den รถverordnade konstruktormetoden.
2 fรฅ alla Hรคmtar alla fรคlt och poster frรฅn databasen utan nรฅgra villkor.
3 get_by_id Hรคmtar en enskild rad frรฅn databasen med hjรคlp av primรคrnyckeln av typen INT med namnet id.
4 komma_vart Hรคmtar alla fรคlt frรฅn databasen baserat pรฅ de angivna kriterierna.
5 infoga Infogar en ny post i databasen.
6 uppdatering Uppdaterar en befintlig databaspost baserat pรฅ primรคrnyckeln av INT-typen med namnet id.
7 radera Tar bort en befintlig post frรฅn databasen baserat pรฅ primรคrnyckeln av typen INT med namnet id.

Fรถljande bild visar klassdiagrammet och hur undermodellerna Pals och Cities relaterar till รถverordnade modellen BaseModel.

Klassdiagram fรถr BaseModel med Pals- och Cities-modeller

Vi kommer att skapa tvรฅ modeller enligt beskrivningen i bilden ovan. Skapa en ny klass BaseModel i application/models/BaseModel.php och lรคgg till fรถljande 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);
}
}

Hรคr:

  • protected $table = โ€; definierar en skyddad variabel med namnet table. Denna fylls i av respektive underklass fรถr att ange vilken tabell basmodellmetoderna ska interagera med.
  • public function __construct() {โ€ฆ} definierar konstruktorn och exekverar konstruktorn fรถr den รถverordnade klassen CI_Model.
  • get_all() {โ€ฆ} anvรคnder databasbiblioteket och vรคrdet fรถr $table fรถr att kรถra SELECT-frรฅgan.
  • get_by_id($id) {โ€ฆ} hรคmtar en enda rad och accepterar parametern $id av datatypen INT.
  • get_where($where) {โ€ฆ} definierar en get-metod som lรฅter dig ange en where-klausul.
  • insert($data) {โ€ฆ} accepterar arrayparametern $data som innehรฅller de vรคrden som ska skrivas till databasen.
  • update($id, $data) {โ€ฆ} accepterar arrayparametern $data som innehรฅller de vรคrden som ska uppdateras.
  • delete($id) {โ€ฆ} accepterar en parameter $id av datatypen INT.

Nu nรคr vi รคr klara med den รถverordnade modellklassen, lรฅt oss skapa vรฅr Pals-modell. Skapa en ny fil i application/models/Pals_model.php och lรคgg till fรถljande 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();
}
}

Hรคr:

  • klass Pals_model extends BaseModel {โ€ฆ} utรถkar fรถrรคldermodellen BaseModel och gรถr automatiskt alla dess metoder tillgรคngliga fรถr underklassen.
  • protected $table = 'pals'; definierar tabellnamnet som รคr associerat med denna modell.
  • __construct() {โ€ฆ} initierar den รถverordnade konstruktorn.
  • public function get_by_id($id) {โ€ฆ} รฅsidosรคtter get_by_id fรถr att tillhandahรฅlla en anpassad implementering. Frรฅgan anvรคnder en join fรถr att hรคmta stadsnamnet frรฅn cities-tabellen.
  • public function get_all() {โ€ฆ} รฅsidosรคtter get_all fรถr att implementera en join-frรฅga mellan tabellerna pals och cities.

Skapa en ny fil i application/models/Cities_model.php:

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

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

Hรคr:

  • skyddad $table = 'stรคder'; definierar modellens databastabell.

Som ni kan se sparar arv oss mycket tid nรคr vi arbetar med modeller i CodeTรคndare.

Kontakter Manager Controllers

Nu nรคr vi har skapat modellerna, lรฅt oss skapa kontrollerna fรถr vรฅr applikation. Vi kommer att ha tvรฅ kontrollanter, Cities och Contacts. Lรฅt oss bรถrja med Cities. Skapa en ny fil Cities.php i katalogen application/controllers och lรคgg till fรถljande 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'));
}
}

Hรคr:

  • Koden ovan implementerar alla metoder som behรถvs fรถr att skapa, uppdatera, ta bort och lรคsa rader frรฅn databasen.

Skapa en annan fil, Contacts.php, i application/controllers och lรคgg till fรถljande 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'));
}
}

Kontakthanterarens vyer

Vi har redan tittat pรฅ formulรคr och validering i CodeIgniter i de tidigare handledningarna, sรฅ kommer vi att anvรคnda koden vi utvecklade dรคr. Fรถr fullstรคndighetens skull kommer vyerna av vรฅr applikation att se ut enligt fรถljande:

Kontakthanterarens vyer

Du kan ladda ner koden fรถr vyerna genom att klicka pรฅ lรคnken nedan:

CodeLadda ner vyer fรถr Igniter Contacts Manager

Vanliga frรฅgor

En BaseModel lagrar de delade metoderna insert, read, update och delete en gรฅng. Underordnade modeller รคrver dem och รฅsidosรคtter bara det som skiljer sig รฅt, vilket eliminerar dubbelarbete och hรฅller varje modell liten.

Varje kontakt lagrar ett city_id, inte stadsnamnet. Override-funktionen kopplar samman cities-tabellen sรฅ att frรฅgan returnerar det lรคsbara stadsnamnet bredvid varje kontakt i ett enda resultat.

Styrenheten laddar modellen, validerar det inskickade formulรคret och antingen sparar data och omdirigerar, eller laddar om formulรคret med fel. Den kopplar samman modellen, vyerna och valideringsbiblioteket.

Ja. Frรฅn dina tabelldefinitioner kan AI producera en BaseModel med CRUD-metoder och en undermodell per tabell, och lรคgga till join-overrides dรคr en frรคmmande nyckel behรถver en lรคsbar etikett. RevVisa de genererade kopplingarna.

Databasbiblioteket tillhandahรฅller rรฅa frรฅge- och Active Record-metoder. En modell lindar in dessa anrop i meningsfulla, รฅteranvรคndbara operationer fรถr en specifik tabell, keeping dataรฅtkomst frรฅn kontrollenheten.

Sammanfatta detta inlรคgg med: