CodeIgniter数据库:配置、更新和删除数据

⚡ 智能摘要

CodeIgniter Database 为联系人管理器构建模型和控制器,该联系人管理器由以下系统提供支持: MySQL共享的 BaseModel 实现了插入、读取、更新和删除操作,子模型 Pals 和 Cities 继承了它,因此控制器在整个应用程序中重用相同的数据库操作。

  • 🗄️ 架构: 两个相关的表,朋友表和城市表,通过外键建立一对一关系。
  • ⚙️ 配置: database.php 设置连接并加载数据库库。
  • 🧬 基础模型: 父模型定义了 get_all、get_by_id、get_where、insert、update 和 delete。
  • ‍👩‍👧 遗产: Pals 和 Cities 继承自 BaseModel,因此它们会重用 BaseModel 的方法并在需要时进行重写。
  • 🔗 加入: Pals 模型将城市连接起来,以获取城市名称以及联系方式。
  • 🎛️ 控制器: 城市和联系人控制器将模型、表单和验证连接在一起。
  • ♻️ 重用: 继承可以消除重复的 CRUD 代码,并保持模型简洁。

CodeIgniter数据库

CodeIgniter数据库

在之前的教程中,我们介绍了以下基础知识: Code本教程将介绍如何使用 Igniter Active Record 进行数据库的插入、更新、删除和读取操作。我们将创建数据库模型,并使用表单来创建和更新数据库记录。如果您是数据库操作的完全新手,那么本教程将非常适合您。 CodeIgniter,建议您阅读以下内容: 先前的教程 隐形价值。

CodeIgniter 数据库配置

我们将首先创建教程项目数据库。我们将创建一个简单的数据库来管理联系人信息,其中包含两个表,分别名为“朋友”和“他们居住的城市”。“朋友”表和“城市”表是一对一的关系,“城市”表中的“id”作为主键,“朋友”表中的“city_id”作为外键。

运行以下脚本来创建数据库:

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

CodeIgniter数据库模型

现在我们将为数据库创建模型。模型是 M 部分。 MVC。该模型处理数据访问、数据操作和业务逻辑。

In Code在 Igniter 中,每个模型都必须定义它将支持的方法。为了避免在每个模型中重复编写相同的代码,我们将利用面向对象编程中的继承特性,创建一个父模型类来定义我们希望所有模型支持的基本方法。

下表显示了我们将定义的方法以及如何访问数据。

S / N 付款方式 描述
1 __构造 定义调用父构造方法的构造方法。
2 得到所有 从数据库中检索所有字段和记录,不设任何条件。
3 通过 id 获取 使用名为 id 的 INT 类型主键从数据库中检索单行数据。
4 到达哪里 根据给定的条件从数据库中检索所有字段。
5 向数据库中插入一条新记录。
6 更新 根据名为 id 的 INT 类型主键更新现有数据库记录。
7 删除 根据名为 id 的 INT 类型主键,从数据库中删除现有记录。

下图显示了类图以及 Pals 和 Cities 子模型与父模型 BaseModel 的关系。

包含伙伴和城市模型的基础模型类图

我们将创建两个模型,如上图所示。在 application/models/BaseModel.php 中创建一个名为 BaseModel 的新类,并添加以下代码:

<?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) {…} 检索单行数据,并接受 INT 数据类型的参数 $id。
  • get_where($where) {…} 定义了一个 get 方法,允许您设置 where 子句。
  • insert($data) {…} 接受数组参数 $data,其中包含要写入数据库的值。
  • update($id, $data) {…} 接受数组参数 $data,其中包含要更新的值。
  • delete($id) {…} 接受一个 INT 数据类型的参数 $id。

现在我们已经完成了父模型类的创建,接下来让我们创建 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();
}
}

这里:

  • class Pals_model extends BaseModel {…} 继承自父模型 BaseModel,并自动使其所有方法对子类可用。
  • protected $table = 'pals'; 定义与此模型关联的表名。
  • __construct() {…} 初始化父构造函数。
  • public function get_by_id($id) {…} 重写了 get_by_id 函数,提供了自定义实现。该查询使用连接(join)从 cities 表中检索城市名称。
  • 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();
}
}

这里:

  • protected $table = 'cities'; 定义模型数据库表。

如您所见,继承在处理模型时可以节省我们大量时间。 Code点火器。

联系人管理器控制器

现在我们已经创建了模型,接下来让我们为应用程序创建控制器。我们将创建两个控制器:城市(Cities)和联系人(Contacts)。首先从城市控制器开始。在 application/controllers 目录下创建一个名为 Cities.php 的新文件,并添加以下代码:

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

这里:

  • 上面的代码实现了从数据库中创建、更新、删除和读取行所需的所有方法。

在 application/controllers 目录下创建另一个文件 Contacts.php,并添加以下代码:

<?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,并将继续使用我们当时编写的代码。为了完整起见,我们的应用程序视图如下所示:

联系人管理器视图

您可以点击下方链接下载视图的代码:

CodeIgniter 联系人管理器视图下载

常见问题

BaseModel 包含共享的插入、读取、更新和删除方法,这些方法只需保存一次。子模型继承 BaseModel,并仅重写不同的方法,这样可以避免代码重复,并保持每个模型的简洁性。

每个联系人存储的是 city_id,而不是城市名称。此覆盖操作会连接 cities 表,以便查询在单个结果中返回易于理解的城市名称以及每个联系人。

控制器加载模型,验证提交的表单,然后保存数据并重定向,或者重新加载表单并显示错误信息。它连接模型、视图和验证库。

是的。根据您的表定义,AI 可以生成一个包含 CRUD 方法的基础模型,每个表生成一个子模型,并在需要可读标签的外键处添加连接覆盖。 Rev查看生成的连接。

数据库库提供原始查询和 Active Record 方法。模型将这些调用封装成针对特定表的有意义的、可重用的操作。ping 从控制器访问数据。

总结一下这篇文章: