php教程

超轻量级php框架startmvc

CI框架(CodeIgniter)公共模型类定义与用法示例

更新时间:2020-03-22 18:51:58 作者:startmvc
本文实例讲述了CI框架(CodeIgniter)公共模型类定义与用法。分享给大家供大家参考,具体如下

本文实例讲述了CI框架(CodeIgniter)公共模型类定义与用法。分享给大家供大家参考,具体如下:

我们都知道,操作数据库的方法都写在模型中。但是一般情况下,一张表往往至少对应4个操作,也就是所谓crud。那么如果20张表,所对应的模型方法,就达到了80个,重复的操作显然这已经是一个体力活儿。

那么就对单表操作时,我们进行一下简单的封装。如下是ci框架的示例:


<?php
/**
 * Created by PhpStorm.
 * User: kangjianrong
 * Date: 16-8-26
 * Time: 上午10:29
 */
class My_model extends CI_Model {
 //数据库
 public $errors = array();
 const dataBase = 'qndnew';
 public function __construct()
 {
 // Call the CI_Model constructor
 parent::__construct();
 }
 /**
 * 查询分页数据(使用于简单的单表操作)
 * @param string $model 模型 例如:User_model
 * @param string $table 表名
 * @param string $select_fields 要显示字段
 * @param array $param 查询条件:
 * compare(比较):
 * array($key => $val) $key为要操作的字段,$val为要操作的值
 * array('name !=' => $name, 'id <' => $id, 'date >' => $date);
 * like(模糊查询)
 * array('title' => $match, 'page1' => $match, 'page2' => $match)
 * customStr(自定义字符串):
 * "name='Joe' AND status='boss' OR status='active'"
 * in:
 * array('userName' => array('Frank', 'Todd', 'James'))
 * @param string $page 当前页数(查询全部数据时,设置为空)
 * @param string $limit 查询条数(查询全部数据时,设置为空)
 * @param array $order 排序条件:
 * array($key => $val)
 * $key为排序依据的字段,
 * $val为排序的方式【asc (升序,默认)或 desc(降序), 或 random(随机)】
 * @$isReturnCount boole 是否返回总条数
 * @return array|boolean
 *
 */
 public function pageData($model, $table, $param = array(),$select_fields = '', $page = '1', $limit = '15', $order = array(),$isReturnCount = true){
 if(empty($model) || empty($table)){
 return false;
 }
 $this -> load -> model($model);
 $table = $this->db->dbprefix.$table;
 //处理查询字段
 if(!empty($select_fields)){
 $this->db->select($select_fields)->from($table);
 }elseif(isset($this -> $model -> selectFields)){
 $this->db->select($this -> $model -> selectFields)->from($table);
 }else{
 $this->db->select('*')->from($table);
 }
 //处理查询条件
 if (is_array($param) && count($param) > 0){
 $this -> parseParam($param);
 }
 //统计总数
 if($isReturnCount){
 $rs['count'] = $this->db->count_all_results('',false);//不重置查询构造器
 array_push($this -> errors,$this->db->last_query());
 }
 //分页数据处理
 if(isset($page) && isset($param['limit'])){
 //分页边界值 设置
 $offset = $param['page'] <= 1 ? 0 : ($param['page']-1) * $param['limit'];
 $this->db->limit($param['limit'], $offset);
 }
 //排序规则的组合
 if (!empty($order) && is_array($order))
 {
 foreach ($order as $key => $val)
 {
 $this->db->order_by($key, $val);
 }
 }else{
 //默认按照此表的主键倒序
 $primary = $this->getPrimary();
 if(!empty($primary))
 {
 $this->db->order_by($primary, 'DESC');
 }
 }
 $query = $this->db->get();
 array_push($this -> errors,$this->db->last_query());
 $rs['list'] = $query->result_array();
 return $rs;
 }
 /**
 * 解析参数
 */
 private function parseParam($param){
 if(isset($param['compare'])){
 foreach ($param['compare'] as $key => $val){
 if (!empty($val)) $this->db->where($key, $val);
 }
 }
 if(isset($param['like'])){
 foreach ($param['like'] as $key => $val){
 if (!empty($val)) $this->db->like($key, $val);
 }
 }
 if(isset($param['in'])){
 foreach ($param['in'] as $key => $val){
 if (!empty($val)) $this->db->where_in($key, $val);
 }
 }
 if(isset($param['customStr'])){
 if (!empty($val)) $this->db->where($param['customStr']);
 }
 }
 /**
 * 新增信息
 * @param string $table 表名称
 * @param array $param 数据变量
 * @return INT ID
 */
 public function add($table = '', $param = array())
 {
 if(empty($table) || !is_array($param) || empty ($param)){
 return FALSE;
 }
 //写入数据表
 $this->db->insert($table, $param);
 array_push($this -> errors,$this->db->last_query());
 //返回记录ID
 return $this->db->insert_id();
 }
 /**
 * 更新分类信息
 * @param string $table 表名称
 * @param string $primary 表主键
 * @param int $id 分类ID
 * @param array $param 更新的数据
 * @return type
 */
 public function update($table = '', $primary = '', $id = 0, $param = array())
 {
 if(empty($table) || empty($primary) || empty($param) || empty($id))
 {
 return FALSE;
 }
 $id = (int)$id;
 $this->db->where($primary, $id)
 ->limit(1)
 ->update($table, $param);
 array_push($this -> errors,$this->db->last_query());
 return $this->db->affected_rows();
 }
 /**
 * 删除指定ID记录
 * @param string $table 表名称
 * @param string $primary 表主键
 * @param array $id 分类ID
 * @return int
 */
 public function delete($table = '', $primary = '', $id = array()){
 if(empty($table) || empty($primary) || empty($id)){
 return FALSE;
 }
 $this->db->where_in($primary, $id)
 ->delete($table);
 array_push($this -> errors,$this->db->last_query());
 return $this->db->affected_rows();
 }
 /**
 * 获取表的主键
 * @param string $database 数据库名称
 * @param strting $table 表名称
 */
 public function getPrimary($table = '', $database = self::dataBase)
 {
 if(empty($database) || empty($table))
 {
 return FALSE;
 }
 $sql = "SELECT k.column_name
 FROM information_schema.table_constraints t
 JOIN information_schema.key_column_usage k
 USING (constraint_name,table_schema,table_name)
 WHERE t.constraint_type='PRIMARY KEY'
 AND t.table_schema='qndnew'
 AND t.table_name='qnd_user'";
 $query = $this->db->query($sql)->result_array();
 return isset($query[0]['column_name']) ? $query[0]['column_name'] : false;
 }
 /**
 * debug sql语句
 */
 public function debugSql(){
 if(count($this->errors) > 0){
 foreach($this->errors as $val){
 echo $val.'<br>';
 }
 }
 }
}

具体的业务逻辑模型如下:


class User_model extends My_model {
 const USER = 'qnd_user';
 public $selectFields = array(
 'id',
 'guid',
 'phone',
 'userName',
 'password',
 'headPortraits',
 'nickName',
 'createTime',
 );
 const SMS_ROLE = 'qnd_role';
 public function __construct()
 {
 }
}

控制器中测试如下:


public function modelTest(){
 $this -> load -> model('User_model'); // 載入 model
 $whereArr = array(
 'compare'=>array(
 'userName' => 'Frank',
 ),
 );
 $rs = $this -> User_model -> pageData('User_model','user',$whereArr);
 print_r($rs);
 $this -> User_model -> debugSql();
 }

CI框架 CodeIgniter 公共模型类