CodeDatabáze Igniter: Konfigurace, aktualizace a mazání dat

⚡ Chytré shrnutí

CodeDatabáze Igniter vytváří modely a řadiče pro správce kontaktů s podporou MySQLSdílený BaseModel implementuje vkládání, čtení, aktualizaci a mazání a podřízené modely Pals a Cities jej dědí, takže kontrolery opakovaně používají stejné databázové operace v celé aplikaci.

  • 🗄️ Schéma: Dvě související tabulky, pals a cities, modelují vztah jeden k jednomu pomocí cizího klíče.
  • ⚙️ Konfigurace: database.php nastaví připojení a načte se knihovna databáze.
  • 🧬 Základní model: Nadřazený model definuje metody get_all, get_by_id, get_where, insert, update a delete.
  • 👨‍👩‍👧 Dědictví: Pals a Cities rozšiřují BaseModel, takže znovu používají jeho metody a v případě potřeby je přepisují.
  • 🔗 Připojí se: Model Pals spojuje města, aby načetl název města spolu s kontaktními údaji.
  • 🎛️ Ovladače: Kontroléry Cities a Contacts propojují modely, formuláře a validaci.
  • ♻️ Opětovné použití: Dědičnost odstraňuje opakovaný kód CRUD a udržuje modely štíhlé.

CodeDatabáze zapalovačů

CodeDatabáze zapalovačů

V předchozím tutoriálu jsme se zabývali základy CodeAktivní záznam Igniter a jak vkládat, aktualizovat, mazat a číst záznamy z databáze. V tomto tutoriálu si vytvoříme modely databází a použijeme formuláře k vytváření a aktualizaci záznamů v databázi. Pokud s prací s databázemi v... CodeZapalovač, doporučuje se přečíst si předchozí tutoriál .

CodeKonfigurace databáze zapalovače

Začneme vytvořením databáze tutoriálního projektu. Vytvoříme jednoduchou databázi pro správu kontaktních údajů se dvěma tabulkami s názvem pals a městy, ve kterých žijí. Vztah mezi pals a cities je jeden k jednomu, kde id v tabulce cities je primárním klíčem a city_id je cizím klíčem v tabulce pals.

Pro vytvoření databáze spusťte následující skripty:

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

Nyní si vytvořme tabulku měst:

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

CodeModely databáze zapalovačů

Nyní vytvoříme modely pro naši databázi. Model je část M databáze. MVC. Model se zabývá přístupem k datům, manipulací s daty a obchodní logikou.

In CodeV Igniteru musí každý model definovat metody, které bude podporovat. Místo opakování stejného kódu v každém modelu využijeme dědičnosti v objektově orientovaném programování a vytvoříme nadřazenou třídu modelu, která definuje základní metody, které chceme, aby naše modely podporovaly.

Níže uvedená tabulka ukazuje metody, které budeme definovat, a jak se bude k datům přistupovat.

S / N Metoda Description
1 __postavit Definuje metodu konstruktoru, která volá nadřazenou metodu konstruktoru.
2 dostat všechny Načte všechna pole a záznamy z databáze bez jakýchkoli podmínek.
3 get_by_id Načte jeden řádek z databáze pomocí primárního klíče typu INT s názvem id.
4 get_where Načte všechna pole z databáze na základě zadaných kritérií.
5 INSERT Vloží nový záznam do databáze.
6 aktualizovat Aktualizuje existující záznam v databázi na základě primárního klíče typu INT s názvem id.
7 vymazat Odstraní existující záznam z databáze na základě primárního klíče typu INT s názvem id.

Následující obrázek znázorňuje diagram tříd a vztah podřízených modelů Pals a Cities k nadřazenému modelu BaseModel.

Diagram tříd BaseModel s modely Pals a Cities

Vytvoříme dva modely, jak je popsáno na obrázku výše. Vytvořte novou třídu BaseModel v souboru application/models/BaseModel.php a přidejte následující kód:

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

Zde:

  • protected $table = ”; definuje chráněnou proměnnou s názvem table. Tato proměnná je naplněna příslušnou podtřídou třídy a určuje, se kterou tabulkou by měly metody základního modelu interagovat.
  • Veřejná funkce __construct() {…} definuje konstruktor a spouští konstruktor nadřazené třídy CI_Model.
  • Funkce get_all() {…} používá databázovou knihovnu a hodnotu proměnné $table ke spuštění dotazu SELECT.
  • get_by_id($id) {…} načte jeden řádek a přijme parametr $id datového typu INT.
  • Metoda get_where($where) {…} definuje metodu get, která umožňuje nastavit klauzuli where.
  • insert($data) {…} přijímá parametr pole $data obsahující hodnoty, které se mají zapsat do databáze.
  • update($id, $data) {…} přijímá parametr pole $data obsahující hodnoty, které mají být aktualizovány.
  • delete($id) {…} přijímá parametr $id datového typu INT.

Nyní, když jsme hotovi s nadřazenou třídou modelu, vytvořme náš model Pals. Vytvořte nový soubor v souboru application/models/Pals_model.php a přidejte do něj následující kód:

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

Zde:

  • class Pals_model extends BaseModel {…} rozšiřuje nadřazený model BaseModel a automaticky zpřístupňuje všechny jeho metody podřízené třídě.
  • protected $table = 'pals'; definuje název tabulky přidružené k tomuto modelu.
  • __construct() {…} inicializuje konstruktor nadřazené třídy.
  • Veřejná funkce get_by_id($id) {…} přepisuje funkci get_by_id a poskytuje tak vlastní implementaci. Dotaz používá spojení k načtení názvu města z tabulky cities.
  • public function get_all() {…} přepisuje funkci get_all a implementuje dotaz na spojení mezi tabulkami pals a cities.

Vytvořte nový soubor v souboru application/models/Cities_model.php:

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

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

Zde:

  • protected $table = 'města'; definuje modelovou databázovou tabulku.

Jak vidíte, dědičnost nám ušetří spoustu času při práci s modely v CodeZapalovač.

Ovladače Contacts Manager

Nyní, když jsme vytvořili modely, vytvořme pro naši aplikaci controllery. Budeme mít dva controllery, Cities a Contacts. Začněme s Cities. Vytvořte nový soubor Cities.php v adresáři application/controllers a přidejte následující kód:

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

Zde:

  • Výše uvedený kód implementuje všechny metody potřebné k vytváření, aktualizaci, mazání a čtení řádků z databáze.

Vytvořte další soubor Contacts.php v adresáři application/controllers a přidejte do něj následující kód:

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

Zobrazení Správce kontaktů

Formuláře a validaci jsme si již prohlédli v CodeIgniter v předchozích tutoriálech a použijeme kód, který jsme tam vyvinuli. Pro úplnost budou pohledy naší aplikace vypadat následovně:

Zobrazení Správce kontaktů

Kód pro zobrazení si můžete stáhnout kliknutím na níže uvedený odkaz:

CodeSprávce kontaktů zapalovače – zobrazení – stažení

Nejčastější dotazy

Základní model (BaseModel) obsahuje sdílené metody insert, read, update a delete pouze jednou. Podřízené modely je dědí a přepisují pouze to, co se liší, což eliminuje duplicitu a udržuje každý model malý.

Každý kontakt ukládá city_id, nikoli název města. Toto přepsání spojí tabulku cities, takže dotaz vrátí čitelný název města vedle každého kontaktu v jednom výsledku.

Kontroler načte model, ověří odeslaný formulář a buď uloží data a přesměruje, nebo formulář znovu načte s chybami. Propojí model, pohledy a validační knihovnu.

Ano. Z definic vašich tabulek může umělá inteligence vytvořit BaseModel s metodami CRUD a jedním podřízeným modelem na tabulku a přidat přepsání spojení tam, kde cizí klíč potřebuje čitelný popisek. Revzobrazit vygenerované spojení.

Databázová knihovna poskytuje metody pro dotazy a Active Record. Model zabalí tato volání do smysluplných, opakovaně použitelných operací pro konkrétní tabulku, udržuje...ping přístup k datům z řídicí jednotky.

Shrňte tento příspěvek takto: