<?php // +---------------------------------------------------------------------- // | ThinkPHP [ WE CAN DO IT JUST THINK ] // +---------------------------------------------------------------------- // | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved. // +---------------------------------------------------------------------- // | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 ) // +---------------------------------------------------------------------- // | Author: liu21st <[email protected]> // +---------------------------------------------------------------------- namespace think; // 命名空间 跟目录 think use InvalidArgumentException;// 系统 错误 异常 use think\Cache;// 缓存 use think\Db;// 数据库 use think\db\Query; // 查询语句 use think\Exception;// 异常 use think\Exception\ValidateException;// 验证异常 use think\Loader;// 加载类 use think\model\Relation;// 关系类 use think\paginator\Collection as PaginatorCollection;// 分页 类 /** * Class Model * @package think * @method static PaginatorCollection paginate(integer $listRows = 15, boolean $simple = false, array $config = []) 分页查询 * @method static mixed value($field, $default = null) 得到某个字段的值 * @method static array column($field, $key = ‘‘) 得到某个列的数组 * @method static integer count($field = ‘*‘) COUNT查询 * @method static integer sum($field = ‘*‘) SUM查询 * @method static integer min($field = ‘*‘) MIN查询 * @method static integer max($field = ‘*‘) MAX查询 * @method static integer avg($field = ‘*‘) AVG查询 * @method static setField($field, $value = ‘‘) * @method static Query where($field, $op = null, $condition = null) 指定AND查询条件 * @method static static findOrFail($data = null) 查找单条记录 如果不存在则抛出异常 Fail 异常 * */ abstract class Model implements \JsonSerializable, \ArrayAccess {// 抽象类 继承了 JsonSerializable, ArrayAccess // 数据库对象池 protected static $links = [];// 数据库 对象 连接池 // 数据库配置 protected $connection = [];// 数据库 配置项目 // 当前模型名称 protected $name;// 模型名称 // 数据表名称 protected $table;// 表名称 // 当前类名称 protected $class;// 类名 // 回调事件 private static $event = [];// 回调事件 // 错误信息 protected $error;// 错误信息 // 字段验证规则 protected $validate;// 验证规则 // 数据表主键 复合主键使用数组定义 不设置则自动获取 protected $pk;// 主键 // 数据表字段信息 留空则自动获取 protected $field = [];// 数据表 字段信息 留空 就自动获取 // 只读字段 protected $readonly = [];// 只读字段 // 显示属性 protected $visible = [];// 显示属性 // 隐藏属性 protected $hidden = [];// 隐藏 属性 // 追加属性 protected $append = [];// 追加属性 // 数据信息 protected $data = [];// 数据信息 // 记录改变字段 protected $change = [];// 改变字段 // 保存自动完成列表 protected $auto = [];// 保存自动完成列表 // 新增自动完成列表 protected $insert = [];// 新增 自动完成列表 // 更新自动完成列表 protected $update = [];// 更新自动完成列表 // 是否需要自动写入时间戳 如果设置为字符串 则表示时间字段的类型 protected $autoWriteTimestamp;// 是否需要自动写入时间戳,如果设置为字符串, 则表示时间字段的类型 // 创建时间字段 protected $createTime = ‘create_time‘;// 创建时间字段 // 更新时间字段 protected $updateTime = ‘update_time‘;// 更新时间字段 // 时间字段取出后的默认时间格式 protected $dateFormat = ‘Y-m-d H:i:s‘;// 默认 的时间格式 // 字段类型或者格式转换 protected $type = [];// 字段类型 或者 格式转换 // 是否为更新数据 protected $isUpdate = false;// 是否为更新数据 // 更新条件 protected $updateWhere;//更新条件 // 当前执行的关联对象 protected $relation;// 当前执行的关联对象 // 验证失败是否抛出异常 protected $failException = false;// 是否抛出异常 // 全局查询范围 protected static $useGlobalScope = true;// 全局查询范围 /** * 初始化过的模型. * * @var array */ protected static $initialized = [];// 模型初始化,看见这种配置,就会发现 更多的类型 /** * 架构函数 * @access public * @param array|object $data 数据 */ public function __construct($data = [])// 架构函数 { if (is_object($data)) {// 查看 传过来的 数据 是否为对象 $this->data = get_object_vars($data);// 对象方式获取 系统函数 } else { $this->data = $data; } // 当前类名 $this->class = get_class($this);// 获取 类名 应该就不是 model 类 了,应该是继承他的类 if (empty($this->name)) {// 如果当前的模型名 为空 // 当前模型名 $this->name = basename(str_replace(‘\\‘, ‘/‘, $this->class));// 获取 类名 前面的部分 进行 } if (is_null($this->autoWriteTimestamp)) {// 是否为空 // 自动写入时间戳 $this->autoWriteTimestamp = $this->db()->getConfig(‘auto_timestamp‘);// 大哥啊,你这个终于分开了,要不太费劲了 } // 执行初始化操作 $this->initialize();// 进行 其它的初始化 操作 // 疑问? 抽象类 能被初始化吗? 好像可以的 } /** * 获取当前模型的数据库查询对象 * @access public * @return Query */ public function db() { $model = $this->class;// 获取当前模型的数据库查询对象 if (!isset(self::$links[$model])) {// 如果 当前 连接的类 没有被 创建 连接对象 // 设置当前模型 确保查询返回模型对象 $query = Db::connect($this->connection)->model($model);// 创制连接 // 设置当前数据表和模型名 if (!empty($this->table)) { $query->setTable($this->table);// 设置表名 } else { $query->name($this->name);// 设置模型名 } if (!empty($this->field)) {// 获取字段 if (true === $this->field) {// 如果 主键是true $type = $this->db()->getTableInfo(‘‘, ‘type‘); } else {// 否则 $type = []; foreach ((array) $this->field as $key => $val) {// 强转数组 if (is_int($key)) {// 字段类型 配置 $key = $val; $val = ‘varchar‘; } $type[$key] = $val; } } $query->setFieldType($type); $this->field = array_keys($type); $query->allowField($this->field); } if (!empty($this->pk)) {// 获取主键 $query->pk($this->pk); } self::$links[$model] = $query; } // 返回当前模型的数据库查询对象 return self::$links[$model]; } /** * 获取关联模型实例 * @access protected * @param string|array $relation 关联查询 * @return Relation|Query */ protected function relation($relation = null) { if (!is_null($relation)) { // 执行关联查询 return $this->db()->relation($relation); } // 获取关联对象实例 if (is_null($this->relation)) { $this->relation = new Relation($this); } return $this->relation; } /** * 初始化模型 * @access protected * @return void */ protected function initialize() { $class = get_class($this); if (!isset(static::$initialized[$class])) { static::$initialized[$class] = true;// static 应该是 继承当前抽象类实际类 被初始化 static::init();// 实际执行 当前的 数据 } } /** * 初始化处理 * @access protected * @return void */ protected static function init() {}
时间: 2024-10-26 12:12:51