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

Codeigniter 数据库

在上一篇教程中,我们介绍了 CodeIgniter 活动记录的基础知识以及如何插入、更新、删除和读取数据库中的记录。在本教程中,我们将创建数据库模型并使用表单来创建和更新数据库记录。如果您是 CodeIgniter 中数据库操作的新手,建议您阅读上一篇教程

Codeigniter 数据库配置

我们将从创建教程项目数据库开始。我们将创建一个简单的数据库来管理联系人详细信息。我们将创建一个简单的数据库,其中包含两个 (2) 个表,名称分别为朋友和他们居住的城市。朋友和城市之间的关系是一对一的,城市中的 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 数据库模型

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

在 CodeIgniter 中,每个模型都必须定义其将支持的方法。我们不会在每个模型中重复相同的代码,而是利用面向对象编程中的继承,创建一个父模型类,该类将定义我们希望模型支持的基本方法。

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

S / N 付款方式 描述
1 __构造 定义调用父类构造函数方法的构造函数方法
2 得到所有 无条件地从数据库中检索所有字段和记录
3 通过 id 获取 使用 INT 类型的主键 id 从数据库中检索一行
4 到达哪里 根据所基于的标准从数据库中检索所有字段
5 在数据库中插入一条新记录
6 更新 根据 INT 类型的主键 id 更新现有数据库记录
7 删除 根据 INT 类型的主键 id 从数据库中删除一条现有记录

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

CodeIgniter 数据库模型

我们将创建如上图所示的两个模型

在 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) {…} 定义允许您设置 where 子句的 get 方法。
  • insert($data) {…} 定义插入方法并接受包含要写入数据库的值的数组参数 $data。
  • update($id, $data) {…} 定义更新方法并接受包含数据库中要更新的值的数组参数 $data。
  • delete($id) {…} 定义删除方法,该方法接受 $id 的参数,该参数的数据类型应为 INT。

现在我们已经完成了父模型类,让我们创建我们的 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 的查询使用连接从城市表中检索城市名称
  • public function get_all() {…} 重写 get_all 方法,实现 pals 和 cities 表之间的连接查询

在 application/models/Cities.php 中创建一个新文件

<?php
class Cities extends BaseModel {
    protected $table = 'cities';
    
    public function __construct() {
        parent::__construct();
    }
}

这里,

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

从上面的代码可以看出,在 CodeIgniter 中处理模型时,继承为我们节省了大量时间。在下一节中,我们将学习

联系人管理器控制器

现在我们已经创建了模型,让我们为我们的应用程序创建控制器。我们将有两个控制器,即联系人和城市

让我们从城市开始

在 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 联系人管理器视图下载

总结

在本教程中,您将学习如何在 . 我们利用面向对象编程中的继承特性,通过创建实现插入、读取、更新和删除四大数据库操作的基础模型来提高代码的可重用性。

我们已经使用实际应用程序演示了这些概念,并且我们将在接下来的教程中继续这样做,为应用程序添加更多功能。