CodeIgniter 数据库:配置、编辑、更新、删除数据
Codeigniter 数据库
在上一篇教程中,我们介绍了CodeIgniter的Active Record基础以及如何从数据库插入、更新、删除和读取记录。在本教程中,我们将创建数据库模型,并使用表单创建和更新数据库记录。如果您是CodeIgniter数据库操作的新手,建议您阅读上一篇教程。
Codeigniter 数据库配置
我们将从创建教程项目数据库开始。我们将创建一个简单的数据库来管理联系人信息。我们将创建一个包含两个表:pals(朋友)和cities(居住城市)的简单数据库。pals和cities之间的关系是一对一,cities表中的id是主键,pals表中的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`) );
现在我们来创建cities表
CREATE TABLE `cities` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(245) DEFAULT NULL, PRIMARY KEY (`id`) ) ;
CodeIgniter 数据库模型
现在我们将为数据库创建模型。模型是MVC中的M部分。模型处理数据访问、数据操作和业务逻辑。
在CodeIgniter中,每个模型都必须定义它将支持的方法。为了避免在每个模型中重复相同的代码,我们将利用面向对象的编程中的继承,创建一个父模型类,该类将定义我们希望模型支持的基本方法。
下表显示了我们将定义的方法以及数据的访问方式。
| 序号 | 方法 | 描述 |
|---|---|---|
| 1 | __construct | 定义构造函数方法,该方法调用父构造函数方法 |
| 2 | get_all | 检索数据库中的所有字段和记录,没有任何条件 |
| 3 | get_by_id | 使用名为id的INT类型主键从数据库检索单行记录 |
| 4 | get_where | 基于标准从数据库检索所有字段 |
| 5 | insert | 向数据库插入一条新记录 |
| 6 | update | 根据名为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) {…} 定义insert方法,并接受包含要写入数据库的值的数组参数$data。
- update($id, $data) {…} 定义update方法,并接受包含要更新的值的数组参数$data。
- delete($id) {…} 定义delete方法,并接受一个应为INT数据类型的参数$id。
现在我们已经完成了父模型类,让我们创建Pals模型
在application/models/Pals.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 extends BaseModel {…} 继承了父模型BaseModel,并自动使BaseModel中定义的所有方法都可以被子类访问。
- protected $table = ‘pals’; 定义了与我们的父模型关联的表名
- __construct() {…} 初始化父构造函数
- public function get_by_id($id) {…} 重写了get_by_id方法,以提供Pals模型特有的自定义实现。get_by_id的查询使用join语句从cities表中检索城市名称。
- public function get_all() {…} 重写了get_all方法,以实现pals和cities表之间的join查询。
在application/models/Cities.php中创建一个新文件
<?php
class Cities extends BaseModel {
protected $table = 'cities';
public function __construct() {
parent::__construct();
}
}
此处,
protected $table = ‘cities’; 定义了模型的数据库表。
从上面的代码可以看出,在CodeIgniter中使用模型时,继承为我们节省了大量时间。在下一节中,我们将学习
联系人管理器控制器
现在我们已经创建了模型,让我们为我们的应用程序创建控制器。我们将有两个控制器,即Contacts和Cities。
让我们从cities开始
在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'));
}
}
联系人管理器视图
我们已经在之前的教程中了解了CodeIgniter中的表单和验证。我们将使用我们在之前教程中开发的代码。为了完整起见,我们将重现我们在之前教程中创建的代码。
我们将应用程序的视图如下
您可以通过点击下面的链接下载上述视图的代码
摘要
在本教程中,您将学习如何在CodeIgniter中创建模型。我们利用面向对象编程的继承,通过创建一个实现插入、读取、更新和删除这四大数据库操作的基模型来促进代码的可重用性。
我们已经通过实际应用程序演示了这些概念,并且将在接下来的教程中通过为应用程序添加更多功能继续这样做。


