CodeБаза данных Igniter: настройка, обновление и удаление данных.

⚡ Умное резюме

CodeIgniter Database создает модели и контроллеры для менеджера контактов, поддерживаемого MySQLОбщая базовая модель (BaseModel) реализует операции вставки, чтения, обновления и удаления, а дочерние модели Pals и Cities наследуют её, поэтому контроллеры повторно используют одни и те же операции с базой данных во всём приложении.

  • 🇧🇷 Схема: Две связанные таблицы, «друзья» и «города», моделируют отношение «один к одному» по внешнему ключу.
  • ⚙️ Конфигурация: Файл database.php устанавливает соединение, и загружается библиотека баз данных.
  • 🧬 Базовая модель: Родительская модель определяет функции get_all, get_by_id, get_where, insert, update и delete.
  • 👨👩👧 Наследование: Pals и Cities расширяют BaseModel, поэтому они повторно используют его методы и переопределяют их там, где это необходимо.
  • 🔗 Присоединяется: Модель Pals объединяет города, чтобы получить название города вместе с контактными данными.
  • 🇧🇷 Контроллеры: Контроллеры "Города" и "Контакты" связывают воедино модели, формы и механизмы проверки данных.
  • ♻️ Повторное использование: Наследование устраняет повторяющийся код CRUD и позволяет создавать простые модели.

CodeБаза данных Igniter

CodeБаза данных Igniter

В предыдущем уроке мы рассмотрели основы CodeВ этом руководстве мы рассмотрим Igniter Active Record и способы вставки, обновления, удаления и чтения записей из базы данных. Мы создадим модели базы данных и будем использовать формы для создания и обновления записей в базе данных. Если вы совершенно новичок в работе с базами данных, то это руководство вам пригодится. CodeIgniter, вам рекомендуется ознакомиться с... предыдущий учебник первый.

CodeКонфигурация базы данных Igniter

Начнём с создания базы данных для учебного проекта. Мы создадим простую базу данных для управления контактными данными, состоящую из двух таблиц: pals и citys, в которых живут их друзья. Связь между 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Модели баз данных Igniter

Теперь мы создадим модели для нашей базы данных. Модель — это часть M. MVC. Модель касается доступа к данным, манипулирования ими и бизнес-логики.

In CodeВ Igniter каждая модель должна определять методы, которые она будет поддерживать. Вместо того чтобы повторять один и тот же код в каждой модели, мы воспользуемся наследованием в объектно-ориентированном программировании и создадим родительский класс модели, который определит основные методы, которые мы хотим, чтобы наши модели поддерживали.

В таблице ниже показаны методы, которые мы определим, и способы доступа к данным.

S / N Способ доставки Описание
1 __конструкт Определяет метод-конструктор, который вызывает метод-конструктор родительского класса.
2 получить все Извлекает все поля и записи из базы данных без каких-либо условий.
3 get_by_id Извлекает одну строку из базы данных, используя первичный ключ типа INT с именем id.
4 получить_куда Извлекает все поля из базы данных на основе заданных критериев.
5 вставить Вставляет новую запись в базу данных.
6 обновление Обновляет существующую запись в базе данных на основе первичного ключа типа INT с именем id.
7 удалять Удаляет существующую запись из базы данных на основе первичного ключа типа INT с именем id.

На следующем изображении показана диаграмма классов и то, как дочерние модели Pals и Cities соотносятся с родительской моделью 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 extends BaseModel {…} наследует родительскую модель BaseModel и автоматически делает все ее методы доступными для дочернего класса.
  • protected $table = 'pals'; определяет имя таблицы, связанной с этой моделью.
  • Метод __construct() {…} инициализирует конструктор родительского класса.
  • Функция `public function get_by_id($id) {…}` переопределяет `get_by_id`, предоставляя собственную реализацию. Запрос использует соединение (JOIN) для получения названия города из таблицы `citys`.
  • 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();
}
}

Вот:

  • защищенная таблица $ = 'города'; определяет таблицу базы данных модели.

Как видите, наследование значительно экономит нам время при работе с моделями. 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'));
}
}

Просмотры менеджера контактов

Мы уже рассматривали формы и проверку данных в CodeМы использовали Igniter из предыдущих уроков, и будем применять разработанный там код. Для полноты картины, интерфейс нашего приложения будет выглядеть следующим образом:

Просмотры менеджера контактов

Вы можете скачать код для представлений, перейдя по ссылке ниже:

CodeМенеджер контактов Igniter Просмотры Скачать

Часто задаваемые вопросы (FAQ)

Базовая модель (BaseModel) хранит общие методы вставки, чтения, обновления и удаления только один раз. Дочерние модели наследуют их и переопределяют только отличающиеся, что исключает дублирование и позволяет каждой модели оставаться небольшой.

В каждом контакте хранится city_id, а не название города. Переопределение объединяет данные из таблицы cities, поэтому запрос возвращает читаемое название города вместе с каждым контактом в одном результате.

Контроллер загружает модель, проверяет отправленную форму и либо сохраняет данные и перенаправляет пользователя, либо перезагружает форму с ошибками. Он связывает модель, представления и библиотеку валидации.

Да. На основе определений ваших таблиц ИИ может создать базовую модель с методами CRUD и одной дочерней моделью для каждой таблицы, добавив переопределения соединений там, где для внешнего ключа требуется читаемая метка. RevПросмотрите сгенерированные соединения.

Библиотека базы данных предоставляет методы для выполнения необработанных запросов и методы Active Record. Модель оборачивает эти вызовы в осмысленные, многократно используемые операции для конкретной таблицы, обеспечивая...ping Доступ к данным осуществляется из контроллера.

Подведем итог этой публикации следующим образом: