CodeIgniter-database: gegevens configureren, bijwerken en verwijderen

โšก Slimme samenvatting

CodeIgniter Database bouwt modellen en controllers voor een contactbeheerder die wordt ondersteund door MySQLEen gedeeld BaseModel implementeert invoegen, lezen, bijwerken en verwijderen, en de submodellen Pals en Cities erven hiervan, zodat controllers dezelfde databasebewerkingen in de hele applicatie hergebruiken.

  • ๏ธ Schema: Twee gerelateerde tabellen, 'pals' en 'cities', modelleren een รฉรฉn-op-รฉรฉn-relatie via een externe sleutel.
  • โš™๏ธ config: database.php legt de verbinding vast en laadt de databasebibliotheek.
  • ๐Ÿงฌ Basismodel: Een parent-model definieert get_all, get_by_id, get_where, insert, update en delete.
  • โ€‹ Erfenis: Pals en Cities breiden BaseModel uit, dus ze hergebruiken de methoden ervan en overschrijven ze waar nodig.
  • ๐Ÿ”— Doet mee: Het Pals-model koppelt steden aan elkaar om de stadsnaam en contactgegevens op te halen.
  • ๏ธ Controllers: De Cities- en Contacts-controllers koppelen modellen, formulieren en validatie aan elkaar.
  • โ™ป๏ธ Hergebruik: Overerving elimineert herhaalde CRUD-code en houdt modellen compact.

CodeIgniter-database

CodeIgniter-database

In de vorige tutorial hebben we de basisprincipes behandeld van CodeIn deze tutorial leer je hoe je met Igniter Active Record records invoegt, bijwerkt, verwijdert en leest. We maken databasemodellen en gebruiken formulieren om database-records aan te maken en bij te werken. Als je nog helemaal geen ervaring hebt met databases, is deze tutorial wellicht iets voor jou. CodeIgniter, het wordt aangeraden om het volgende te lezen: vorige zelfstudie kopen.

CodeIgniter-databaseconfiguratie

We beginnen met het opzetten van de database voor het tutorialproject. We maken een eenvoudige database voor het beheren van contactgegevens, met twee tabellen: 'pals' en de steden waarin ze wonen. De relatie tussen 'pals' en 'cities' is een-op-een, waarbij 'id' in 'cities' de primaire sleutel is en 'city_id' de externe sleutel in de 'pals'-tabel.

Voer de volgende scripts uit om de database te maken:

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

Laten we nu de tabel met steden aanmaken:

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

CodeIgniter-databasemodellen

We gaan nu modellen maken voor onze database. Het model is het M-gedeelte van de MVC. Het model behandelt gegevenstoegang, gegevensmanipulatie en bedrijfslogica.

In CodeIn Igniter moet elk model de methoden definiรซren die het zal ondersteunen. In plaats van dezelfde code in elk model te herhalen, maken we gebruik van overerving in objectgeoriรซnteerd programmeren en creรซren we een oudermodelklasse die de basismethoden definieert die onze modellen moeten ondersteunen.

De onderstaande tabel toont de methoden die we zullen definiรซren en hoe toegang zal worden verkregen tot de gegevens.

S / N Methode Beschrijving
1 __constructie Definieert de constructormethode die de constructormethode van de ouderklasse aanroept.
2 alles krijgen Haalt alle velden en records uit de database op zonder enige voorwaarden.
3 get_by_id Haalt รฉรฉn rij uit de database op met behulp van de primaire sleutel van het type INT met de naam id.
4 haal_waar Haalt alle velden uit de database op basis van de opgegeven criteria.
5 invoegen Voegt een nieuw record toe aan de database.
6 -update Werkt een bestaand database-record bij op basis van de primaire sleutel van het type INT met de naam id.
7 verwijderen Verwijdert een bestaand record uit de database op basis van de primaire sleutel van het type INT met de naam id.

De volgende afbeelding toont het klassendiagram en hoe de kindmodellen Pals en Cities zich verhouden tot het oudermodel BaseModel.

Klassendiagram van BaseModel met Pals- en Cities-modellen

We gaan twee modellen maken zoals in de bovenstaande afbeelding is weergegeven. Maak een nieuwe klasse BaseModel aan in application/models/BaseModel.php en voeg de volgende code toe:

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

Hier:

  • protected $table = โ€; definieert een beveiligde variabele met de naam table. Deze wordt gevuld door de betreffende subklasse om aan te geven met welke tabel de methoden van het basismodel moeten interageren.
  • public function __construct() {โ€ฆ} definieert de constructor en voert de constructor van de bovenliggende klasse CI_Model uit.
  • get_all() {โ€ฆ} gebruikt de databasebibliotheek en de waarde van $table om de SELECT-query uit te voeren.
  • get_by_id($id) {โ€ฆ} haalt รฉรฉn rij op en accepteert een parameter $id van het gegevenstype INT.
  • get_where($where) {โ€ฆ} definieert een get-methode waarmee je een where-clausule kunt instellen.
  • De functie `insert($data) {โ€ฆ}` accepteert de arrayparameter `$data`, die de waarden bevat die naar de database moeten worden geschreven.
  • update($id, $data) {โ€ฆ} accepteert de arrayparameter $data die de waarden bevat die moeten worden bijgewerkt.
  • delete($id) {โ€ฆ} accepteert een parameter $id van het gegevenstype INT.

Nu we klaar zijn met de hoofdmodelklasse, gaan we ons Pals-model maken. Maak een nieuw bestand aan in application/models/Pals_model.php en voeg de volgende code toe:

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

Hier:

  • class Pals_model extends BaseModel {โ€ฆ} erft van het oudermodel BaseModel en maakt automatisch al zijn methoden toegankelijk voor de subklasse.
  • protected $table = 'pals'; definieert de tabelnaam die aan dit model is gekoppeld.
  • __construct() {โ€ฆ} initialiseert de constructor van de ouderklasse.
  • De functie `public function get_by_id($id) {โ€ฆ}` overschrijft de `get_by_id`-methode om een โ€‹โ€‹aangepaste implementatie te bieden. De query gebruikt een join om de stadsnaam uit de `cities`-tabel op te halen.
  • public function get_all() {โ€ฆ} overschrijft get_all om een โ€‹โ€‹join-query tussen de tabellen pals en cities te implementeren.

Maak een nieuw bestand aan in application/models/Cities_model.php:

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

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

Hier:

  • protected $table = 'steden'; definieert de modeldatabasetabel.

Zoals je ziet, bespaart overerving ons veel tijd bij het werken met modellen in CodeOntsteker.

Contacten Manager Controllers

Nu we de modellen hebben gemaakt, gaan we de controllers voor onze applicatie maken. We zullen twee controllers hebben: Steden en Contacten. Laten we beginnen met Steden. Maak een nieuw bestand Cities.php aan in de map application/controllers en voeg de volgende code toe:

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

Hier:

  • De bovenstaande code implementeert alle methoden die nodig zijn om rijen in de database aan te maken, bij te werken, te verwijderen en te lezen.

Maak een nieuw bestand met de naam Contacts.php aan in de map application/controllers en voeg de volgende code toe:

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

Contactenbeheerweergaven

We hebben al gekeken naar formulieren en validatie in CodeWe hebben Igniter in de vorige tutorials behandeld en zullen de code gebruiken die we daar hebben ontwikkeld. Voor de volledigheid zien de weergaven van onze applicatie er als volgt uit:

Weergaven van de contactbeheerder

Je kunt de code voor de views downloaden door op de onderstaande link te klikken:

CodeIgniter Contactenbeheerder Weergaven Downloaden

Veelgestelde vragen

Een BaseModel bevat de gedeelde methoden voor invoegen, lezen, bijwerken en verwijderen slechts รฉรฉn keer. Kindmodellen erven deze methoden en overschrijven alleen de methoden die verschillen, waardoor duplicatie wordt voorkomen en elk model klein blijft.

Elk contact heeft een city_id, niet de plaatsnaam. De override voegt de tabel met steden samen, zodat de query de leesbare plaatsnaam samen met elk contact in รฉรฉn resultaat retourneert.

De controller laadt het model, valideert het ingediende formulier en slaat de gegevens op en stuurt de gebruiker door, of laadt het formulier opnieuw met eventuele fouten. Het verbindt het model, de views en de validatiebibliotheek.

Ja. Op basis van uw tabeldefinities kan AI een basismodel genereren met CRUD-methoden en รฉรฉn submodel per tabel, waarbij join-overrides worden toegevoegd waar een foreign key een leesbaar label nodig heeft. RevBekijk de gegenereerde joins.

De databasebibliotheek biedt de ruwe query- en Active Record-methoden. Een model verpakt deze aanroepen in zinvolle, herbruikbare bewerkingen voor een specifieke tabel.ping Gegevenstoegang vanuit de controller.

Vat dit bericht samen met: