CodeΒάση δεδομένων Igniter: Ρύθμιση παραμέτρων, ενημέρωση και διαγραφή δεδομένων

⚡ Έξυπνη Σύνοψη

CodeΗ βάση δεδομένων Igniter δημιουργεί μοντέλα και ελεγκτές για έναν διαχειριστή επαφών που υποστηρίζεται από MySQLΈνα κοινόχρηστο BaseModel υλοποιεί την εισαγωγή, την ανάγνωση, την ενημέρωση και τη διαγραφή, και τα θυγατρικά μοντέλα Pals και Cities το κληρονομούν, επομένως οι ελεγκτές επαναχρησιμοποιούν τις ίδιες λειτουργίες βάσης δεδομένων σε όλη την εφαρμογή.

  • 🗄️ Σχέδιο: Δύο σχετικοί πίνακες, οι pals και οι cities, μοντελοποιούν μια σχέση ένα-προς-ένα με βάση το ξένο κλειδί.
  • ⚙️ Config: Το database.php ορίζει τη σύνδεση και φορτώνεται η βιβλιοθήκη βάσεων δεδομένων.
  • 🧬 Βασικό μοντέλο: Ένα γονικό μοντέλο ορίζει τις συναρτήσεις get_all, get_by_id, get_where, insert, update και delete.
  • 👨👩👧 Κληρονομία: Οι Pals και οι Cities επεκτείνουν το BaseModel, επομένως επαναχρησιμοποιούν τις μεθόδους του και παρακάμπτουν όπου χρειάζεται.
  • 🔗 Συμμετοχές: Το μοντέλο Pals ενώνει πόλεις για να ανακτήσει το όνομα της πόλης μαζί με τα στοιχεία επικοινωνίας.
  • Ελεγκτές: Οι ελεγκτές πόλεων και επαφών συνδέουν μοντέλα, φόρμες και επικυρώσεις.
  • ♻️ Επαναχρησιμοποίηση: Η κληρονομικότητα αφαιρεί τον επαναλαμβανόμενο κώδικα CRUD και διατηρεί τα μοντέλα λεπτά.

CodeΒάση δεδομένων Igniter

CodeΒάση δεδομένων Igniter

Στο προηγούμενο σεμινάριο, καλύψαμε τα βασικά του CodeΕνεργή εγγραφή Igniter και πώς να εισάγετε, να ενημερώνετε, να διαγράφετε και να διαβάζετε εγγραφές από τη βάση δεδομένων. Σε αυτό το σεμινάριο, θα δημιουργήσουμε μοντέλα βάσεων δεδομένων και θα χρησιμοποιήσουμε φόρμες για να δημιουργήσουμε και να ενημερώσουμε εγγραφές βάσης δεδομένων. Εάν είστε εντελώς νέοι στην εργασία με βάσεις δεδομένων στο CodeΑνάφλεξη, σας συμβουλεύουμε να διαβάσετε το προηγούμενο σεμινάριο πρώτη.

CodeΡύθμιση παραμέτρων βάσης δεδομένων ανάφλεξης

Θα ξεκινήσουμε δημιουργώντας τη βάση δεδομένων του έργου του εκπαιδευτικού προγράμματος. Θα δημιουργήσουμε μια απλή βάση δεδομένων για τη διαχείριση των στοιχείων επικοινωνίας, με δύο πίνακες με ονόματα "pals" και τις πόλεις στις οποίες ζουν. Η σχέση μεταξύ "pals" και "cities" είναι ένα προς ένα, με το id στο "cities" ως το πρωτεύον κλειδί και το city_id ως το ξένο κλειδί στον πίνακα "pals".

Εκτελέστε τα ακόλουθα σενάρια για να δημιουργήσετε τη βάση δεδομένων:

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

Ας δημιουργήσουμε τώρα τον πίνακα πόλεων:

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

CodeΜοντέλα βάσης δεδομένων ανάφλεξης

Θα δημιουργήσουμε τώρα μοντέλα για τη βάση δεδομένων μας. Το μοντέλο είναι το μέρος M της MVC. Το μοντέλο ασχολείται με την πρόσβαση δεδομένων, τον χειρισμό δεδομένων και την επιχειρηματική λογική.

In CodeΣτο Igniter, κάθε μοντέλο πρέπει να ορίσει τις μεθόδους που θα υποστηρίζει. Αντί να επαναλαμβάνουμε τον ίδιο κώδικα σε κάθε μοντέλο, θα εκμεταλλευτούμε την κληρονομικότητα στον αντικειμενοστρεφή προγραμματισμό και θα δημιουργήσουμε μια γονική κλάση μοντέλου που θα ορίζει τις βασικές μεθόδους που θέλουμε να υποστηρίζουν τα μοντέλα μας.

Ο παρακάτω πίνακας δείχνει τις μεθόδους που θα ορίσουμε και τον τρόπο πρόσβασης στα δεδομένα.

S / N Μέθοδος Περιγραφή
1 __κατασκευάσει Ορίζει τη μέθοδο κατασκευαστή που καλεί τη γονική μέθοδο κατασκευαστή.
2 Πάρτα ολα Ανακτά όλα τα πεδία και τις εγγραφές από τη βάση δεδομένων χωρίς καμία συνθήκη.
3 get_by_id Ανακτά μία μόνο γραμμή από τη βάση δεδομένων χρησιμοποιώντας το πρωτεύον κλειδί τύπου INT με όνομα id.
4 get_where Ανακτά όλα τα πεδία από τη βάση δεδομένων με βάση τα δεδομένα κριτήρια.
5 εισάγετε Εισάγει μια νέα εγγραφή στη βάση δεδομένων.
6 ενημέρωση Ενημερώνει μια υπάρχουσα εγγραφή βάσης δεδομένων με βάση το πρωτεύον κλειδί τύπου INT με όνομα id.
7 διαγράψετε Διαγράφει μια υπάρχουσα εγγραφή από τη βάση δεδομένων με βάση το πρωτεύον κλειδί τύπου INT με όνομα id.

Η ακόλουθη εικόνα δείχνει το διάγραμμα κλάσεων και τον τρόπο με τον οποίο τα θυγατρικά μοντέλα Pals και Cities σχετίζονται με το γονικό μοντέλο BaseModel.

Διάγραμμα κλάσης του BaseModel με μοντέλα Pals και Cities

Θα δημιουργήσουμε δύο μοντέλα όπως περιγράφεται στην παραπάνω εικόνα. Δημιουργήστε μια νέα κλάση BaseModel στο application/models/BaseModel.php και προσθέστε τον ακόλουθο κώδικα:

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

Εδώ:

  • protected $table = ”; ορίζει μια προστατευμένη μεταβλητή με το όνομα table. Αυτή συμπληρώνεται από την αντίστοιχη θυγατρική κλάση για να καθορίσει με ποιον πίνακα θα πρέπει να αλληλεπιδρούν οι μέθοδοι του βασικού μοντέλου.
  • Η public function __construct() {…} ορίζει τον κατασκευαστή και εκτελεί τον κατασκευαστή της γονικής κλάσης CI_Model.
  • Η get_all() {…} χρησιμοποιεί τη βιβλιοθήκη βάσης δεδομένων και την τιμή του $table για να εκτελέσει το ερώτημα SELECT.
  • Η get_by_id($id) {…} ανακτά μία μόνο γραμμή και δέχεται μια παράμετρο $id τύπου δεδομένων INT.
  • Η get_where($where) {…} ορίζει μια μέθοδο get που σας επιτρέπει να ορίσετε μια ρήτρα where.
  • Η insert($data) {…} δέχεται την παράμετρο πίνακα $data που περιέχει τις τιμές που θα εγγραφούν στη βάση δεδομένων.
  • Η εντολή update($id, $data) {…} δέχεται την παράμετρο πίνακα $data που περιέχει τις τιμές που θα ενημερωθούν.
  • Η delete($id) {…} δέχεται μια παράμετρο $id τύπου δεδομένων INT.

Τώρα που τελειώσαμε με την κλάση γονικού μοντέλου, ας δημιουργήσουμε το μοντέλο Pals. Δημιουργήστε ένα νέο αρχείο στο application/models/Pals_model.php και προσθέστε τον ακόλουθο κώδικα:

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

Εδώ:

  • Η κλάση Pals_model επεκτείνει το γονικό μοντέλο BaseModel {…} και καθιστά αυτόματα όλες τις μεθόδους του προσβάσιμες στην θυγατρική κλάση.
  • protected $table = 'pals'; ορίζει το όνομα του πίνακα που σχετίζεται με αυτό το μοντέλο.
  • Η __construct() {…} αρχικοποιεί τον γονικό κατασκευαστή.
  • Η public function get_by_id($id) {…} παρακάμπτει το get_by_id για να παρέχει μια προσαρμοσμένη υλοποίηση. Το ερώτημα χρησιμοποιεί μια ένωση για να ανακτήσει το όνομα της πόλης από τον πίνακα πόλεων.
  • Η public function get_all() {…} παρακάμπτει την get_all για να υλοποιήσει ένα ερώτημα σύνδεσης μεταξύ των πινάκων pals και cities.

Δημιουργήστε ένα νέο αρχείο στο application/models/Cities_model.php:

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

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

Εδώ:

  • προστατευμένο $table = 'πόλεις'; ορίζει τον πίνακα βάσης δεδομένων μοντέλου.

Όπως μπορείτε να δείτε, η κληρονομικότητα μας εξοικονομεί πολύ χρόνο όταν εργαζόμαστε με μοντέλα σε CodeΑναπτήρ.

Ελεγκτές Διαχείρισης Επαφών

Τώρα που έχουμε δημιουργήσει τα μοντέλα, ας δημιουργήσουμε τους ελεγκτές για την εφαρμογή μας. Θα έχουμε δύο ελεγκτές, τις Πόλεις και τις Επαφές. Ας ξεκινήσουμε με τις Πόλεις. Δημιουργήστε ένα νέο αρχείο Cities.php στον κατάλογο application/controllers και προσθέστε τον ακόλουθο κώδικα:

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

Εδώ:

  • Ο παραπάνω κώδικας υλοποιεί όλες τις μεθόδους που απαιτούνται για τη δημιουργία, την ενημέρωση, τη διαγραφή και την ανάγνωση γραμμών από τη βάση δεδομένων.

Δημιουργήστε ένα άλλο αρχείο Contacts.php στο application/controllers και προσθέστε τον ακόλουθο κώδικα:

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

Προβολές διαχειριστή επαφών

Έχουμε ήδη εξετάσει τις φόρμες και την επικύρωση στο CodeIgniter στα προηγούμενα μαθήματα και θα χρησιμοποιήσουμε τον κώδικα που αναπτύξαμε εκεί. Για λόγους πληρότητας, οι προβολές της εφαρμογής μας θα έχουν ως εξής:

Προβολές διαχειριστή επαφών

Μπορείτε να κατεβάσετε τον κώδικα για τις προβολές κάνοντας κλικ στον παρακάτω σύνδεσμο:

CodeΛήψη προβολών του Igniter Contacts Manager

Συχνές Ερωτήσεις

Ένα BaseModel διατηρεί τις κοινόχρηστες μεθόδους εισαγωγής, ανάγνωσης, ενημέρωσης και διαγραφής μία φορά. Τα θυγατρικά μοντέλα τις κληρονομούν και παρακάμπτουν μόνο ό,τι διαφέρει, γεγονός που εξαλείφει τις διπλότυπες μεθόδους και διατηρεί κάθε μοντέλο μικρό.

Κάθε επαφή αποθηκεύει ένα city_id, όχι το όνομα της πόλης. Η παράκαμψη ενώνει τον πίνακα cities, έτσι ώστε το ερώτημα να επιστρέφει το αναγνώσιμο όνομα της πόλης δίπλα σε κάθε επαφή σε ένα μόνο αποτέλεσμα.

Ο ελεγκτής φορτώνει το μοντέλο, επικυρώνει την υποβληθείσα φόρμα και είτε αποθηκεύει τα δεδομένα και ανακατευθύνει, είτε επαναφορτώνει τη φόρμα με σφάλματα. Συνδέει το μοντέλο, τις προβολές και τη βιβλιοθήκη επικύρωσης.

Ναι. Από τους ορισμούς των πινάκων σας, η Τεχνητή Νοημοσύνη μπορεί να δημιουργήσει ένα BaseModel με μεθόδους CRUD και ένα θυγατρικό μοντέλο ανά πίνακα, προσθέτοντας παρακάμψεις σύνδεσης όπου ένα ξένο κλειδί χρειάζεται μια αναγνώσιμη ετικέτα. Revδείτε τις δημιουργημένες ενώσεις.

Η βιβλιοθήκη βάσης δεδομένων παρέχει τις μεθόδους ακατέργαστου ερωτήματος και ενεργής εγγραφής. Ένα μοντέλο τυλίγει αυτές τις κλήσεις σε ουσιαστικές, επαναχρησιμοποιήσιμες λειτουργίες για έναν συγκεκριμένο πίνακα, διατηρώνταςping πρόσβαση στα δεδομένα εκτός του ελεγκτή.

Συνοψίστε αυτήν την ανάρτηση με: