CodeIgniter-database: Konfigurer, oppdater og slett data

⚡ Smart oppsummering

CodeIgniter Database bygger modeller og kontrollere for en kontaktbehandler støttet av MySQLEn delt BaseModel implementerer innsetting, lesing, oppdatering og sletting, og undermodellene Pals og Cities arver den, slik at kontrollere gjenbruker de samme databaseoperasjonene på tvers av applikasjonen.

  • 🗄️ Skjema: To relaterte tabeller, pals og cities, modellerer en én-til-én-relasjon ved hjelp av fremmednøkkel.
  • ⚙️ config: database.php setter opp tilkoblingen og databasebiblioteket lastes inn.
  • 🧬 Basismodell: En foreldremodell definerer get_all, get_by_id, get_where, insert, update og delete.
  • 👨👩👧 Arv: Pals and Cities utvider BaseModel, slik at de gjenbruker metodene og overstyrer der det er nødvendig.
  • 🔗 Blir med: Pals-modellen kobler sammen byer for å hente bynavnet sammen med kontaktinformasjon.
  • 🎛️ Controllers: By- og kontaktkontrollører kobler modeller, skjemaer og validering sammen.
  • ♻️ Gjenbruk: Arv fjerner gjentatt CRUD-kode og holder modellene tynne.

CodeIgniter-database

CodeIgniter-database

I den forrige veiledningen dekket vi det grunnleggende om CodeIgniter Active Record og hvordan du setter inn, oppdaterer, sletter og leser poster fra databasen. I denne veiledningen skal vi lage databasemodeller og bruke skjemaer for å opprette og oppdatere databaseposter. Hvis du er helt nybegynner innen databasearbeid. CodeTennapparat, anbefales det å lese tidligere opplæring først.

CodeKonfigurasjon av Igniter-databasen

Vi starter med å opprette databasen for veiledningen. Vi oppretter en enkel database for å administrere kontaktinformasjon, med to tabeller kalt pals og byene de bor i. Forholdet mellom pals og cities er én-til-én, med id i cities som primærnøkkel og city_id som fremmednøkkel i pals-tabellen.

Kjør følgende skript for å lage 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`)
);

La oss nå lage bytabellen:

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

CodeIgniter-databasemodeller

Vi skal nå lage modeller for databasen vår. Modellen er M-delen av MVC. Modellen omhandler datatilgang, datamanipulering og forretningslogikk.

In CodeIgniter, hver modell må definere metodene den skal støtte. I stedet for å gjenta den samme koden i hver modell, vil vi dra nytte av arv i objektorientert programmering og opprette en overordnet modellklasse som definerer de grunnleggende metodene vi ønsker at modellene våre skal støtte.

Tabellen nedenfor viser metodene som vi vil definere og hvordan data vil få tilgang.

S / N Metode Tekniske beskrivelser
1 __konstruere Definerer konstruktørmetoden som kaller den overordnede konstruktørmetoden.
2 få_alt Henter alle feltene og postene fra databasen uten noen betingelser.
3 get_by_id Henter en enkelt rad fra databasen ved hjelp av primærnøkkelen av typen INT med navnet id.
4 komme_hvor Henter alle felt fra databasen basert på de gitte kriteriene.
5 Sett Setter inn en ny post i databasen.
6 Oppdater Oppdaterer en eksisterende databasepost basert på primærnøkkelen av INT-typen med navnet id.
7 slette Sletter en eksisterende post fra databasen basert på primærnøkkelen av INT-typen med navnet id.

Følgende bilde viser klassediagrammet og hvordan barnemodellene Pals og Cities forholder seg til den overordnede modellen BaseModel.

Klassediagram av BaseModel med Pals- og Cities-modeller

Vi skal lage to modeller som beskrevet i bildet ovenfor. Opprett en ny klasse BaseModel i application/models/BaseModel.php og legg til følgende kode:

<?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);
}
}

Her:

  • protected $table = ”; definerer en beskyttet variabel kalt tabell. Denne fylles ut av den respektive barneklassen for å spesifisere hvilken tabell basismodellmetodene skal samhandle med.
  • public function __construct() {…} definerer konstruktøren og kjører konstruktøren til den overordnede klassen CI_Model.
  • get_all() {…} bruker databasebiblioteket og verdien til $table til å kjøre SELECT-spørringen.
  • get_by_id($id) {…} henter en enkelt rad og godtar en parameter $id av INT-datatypen.
  • get_where($where) {…} definerer en get-metode som lar deg sette en where-klausul.
  • insert($data) {…} godtar arrayparameteren $data som inneholder verdiene som skal skrives til databasen.
  • update($id, $data) {…} godtar arrayparameteren $data som inneholder verdiene som skal oppdateres.
  • delete($id) {…} aksepterer en parameter $id av INT-datatypen.

Nå som vi er ferdige med den overordnede modellklassen, la oss lage Pals-modellen vår. Opprett en ny fil i application/models/Pals_model.php og legg til følgende kode:

<?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();
}
}

Her:

  • klasse Pals_model extends BaseModel {…} utvider foreldremodellen BaseModel og gjør automatisk alle metodene tilgjengelige for barneklassen.
  • protected $table = 'pals'; definerer tabellnavnet som er knyttet til denne modellen.
  • __construct() {…} initialiserer den overordnede konstruktøren.
  • public function get_by_id($id) {…} overstyrer get_by_id for å gi en tilpasset implementering. Spørringen bruker en kobling for å hente bynavnet fra bytabellen.
  • public function get_all() {…} overstyrer get_all for å implementere en join-spørring mellom pals- og cities-tabellene.

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

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

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

Her:

  • beskyttet $table = 'byer'; definerer modelldatabasetabellen.

Som du kan se, sparer arv oss mye tid når vi jobber med modeller i CodeTennapparat.

Kontaktadministratorkontrollere

Nå som vi har laget modellene, la oss lage kontrollerne for applikasjonen vår. Vi vil ha to kontrollere, Cities og Contacts. La oss starte med Cities. Opprett en ny fil Cities.php i mappen application/controllers og legg til følgende kode:

<?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'));
}
}

Her:

  • Koden ovenfor implementerer alle metodene som trengs for å opprette, oppdatere, slette og lese rader fra databasen.

Opprett en annen fil, Contacts.php, i application/controllers og legg til følgende kode:

<?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'));
}
}

Visninger for kontaktbehandler

Vi har allerede sett på skjemaer og validering i CodeIgniter i de forrige veiledningene, og vi vil bruke koden vi utviklet der. For fullstendighetens skyld vil visningene av applikasjonen vår se slik ut:

Kontaktbehandlingsvisninger

Du kan laste ned koden for visningene ved å klikke på lenken nedenfor:

CodeLast ned Igniter Contacts Manager-visninger

Spørsmål og svar

En BaseModel holder de delte insert-, read-, update- og delete-metodene én gang. Barnemodeller arver dem og overstyrer bare det som er annerledes, noe som fjerner duplisering og holder hver modell liten.

Hver kontakt lagrer en city_id, ikke bynavnet. Overstyringen kobler til bytabellen, slik at spørringen returnerer det lesbare bynavnet ved siden av hver kontakt i ett enkelt resultat.

Kontrolleren laster inn modellen, validerer det innsendte skjemaet, og enten lagrer dataene og omdirigerer, eller laster inn skjemaet på nytt med feil. Den kobler sammen modellen, visningene og valideringsbiblioteket.

Ja. Fra tabelldefinisjonene dine kan AI produsere en BaseModel med CRUD-metoder og én undermodell per tabell, og legge til overstyringer for sammenføyninger der en fremmednøkkel trenger en lesbar etikett. RevSe de genererte koblingene.

Databasebiblioteket tilbyr rå spørring og Active Record-metoder. En modell pakker disse kallene inn i meningsfulle, gjenbrukbare operasjoner for en bestemt tabell, keeping datatilgang ut av kontrolleren.

Oppsummer dette innlegget med: