/** * 删除记录 * @access public * @param mixed $data 主键列表 支持闭包查询条件 * @return integer 成功删除的记录数 */public static function destroy($data)// 删除记录{ $model = new static();// 获取继承者ID $query = $model->db();// 获取 数据库 操作 if (is_array($data) && key($data) !== 0) {// 如果是数组 并且 key 不等于0 $query->where($data);// where 条件进行设置 $data = null;// 赋值为空 } elseif ($data instanceof \Closure) {//如果是个匿名函数 call_user_func_array($data, [ & $query]);// 调用 $data 这样的匿名函数,传入 $query参数 $data = null;// 清空传入的参数 } elseif (is_null($data)) {// 如果传入参数 为空 return 0;//直接返回0 } $resultSet = $query->select($data);// 获得结果集 $count = 0;// 清空条目 if ($resultSet) {// 获取结果集【对象】 foreach ($resultSet as $data) {// 遍历 新函数 $result = $data->delete();// 删除 $count += $result;// 累加 } } return $count;// 返回结果}/** * 命名范围 * @access public * @param string|array|Closure $name 命名范围名称 逗号分隔 * @param mixed ...$params 参数调用 * @return Model */public static function scope($name){ if ($name instanceof Query) {// 如果是查询 实例化 return $name; } $model = new static();// 实例自己 的 model $params = func_get_args();//获取传入的参数 $params[0] = $model->db();// 初始化 数据库连接 if ($name instanceof \Closure) {//闭包 call_user_func_array($name, $params);//调用函数 传递参数 } elseif (is_string($name)) {// 字符串 $name = explode(',', $name); } if (is_array($name)) { foreach ($name as $scope) {// 多个函数调用 $method = 'scope' . trim($scope); if (method_exists($model, $method)) { call_user_func_array([$model, $method], $params);// 类 函数 参数 } } } return $model;// 返回 model}/** * 设置是否使用全局查询范围 * @param bool $use 是否启用全局查询范围 * @access public * @return Model */public static function useGlobalScope($use){ $model = new static();// 好处是 静态的 static::$useGlobalScope = $use;// 是否 return $model;// 返回设置}/** * 根据关联条件查询当前模型 * @access public * @param string $relation 关联方法名 * @param string $operator 比较操作符 * @param integer $count 个数 * @param string $id 关联表的统计字段 * @return Model */public static function has($relation, $operator = '>=', $count = 1, $id = '*'){ $model = new static();// 静态实例化 $info = $model->$relation()->getRelationInfo();// 获取信息 $table = $info['model']::getTable();// 表名 switch ($info['type']) {// 不同的类型 case Relation::HAS_MANY://生成普通的 join 语句 return $model->db()->alias('a') ->join($table . ' b', 'a.' . $info['localKey'] . '=b.' . $info['foreignKey'], $info['joinType']) ->group('b.' . $info['foreignKey']) ->having('count(' . $id . ')' . $operator . $count); case Relation::HAS_MANY_THROUGH:// 居然还有未完成函数,牛叉 // TODO }}/** * 根据关联条件查询当前模型 * @access public * @param string $relation 关联方法名 * @param mixed $where 查询条件(数组或者闭包) * @return Model */public static function hasWhere($relation, $where = []){ $model = new static(); $info = $model->$relation()->getRelationInfo();// 关联信息 switch ($info['type']) { case Relation::HAS_ONE: case Relation::HAS_MANY: $table = $info['model']::getTable(); if (is_array($where)) { foreach ($where as $key => $val) { if (false === strpos($key, '.')) { $where['b.' . $key] = $val; unset($where[$key]); } } } return $model->db()->alias('a') ->field('a.*') ->join($table . ' b', 'a.' . $info['localKey'] . '=b.' . $info['foreignKey'], $info['joinType']) ->where($where); case Relation::HAS_MANY_THROUGH: // TODO }}// 同上 生成使用 has where 的关联查询/** * 解析模型的完整命名空间 * @access public * @param string $model 模型名(或者完整类名) * @return string */protected function parseModel($model){ if (false === strpos($model, '\\')) { $path = explode('\\', get_called_class());// 应该是有一些特殊的用法 array_pop($path); array_push($path, Loader::parseName($model, 1)); $model = implode('\\', $path); }// 获取完整的 命名空间 return $model;}/** * 查询当前模型的关联数据 * @access public * @param string|array $relations 关联名 * @return $this */public function relationQuery($relations){ if (is_string($relations)) {// 关系型查询 $relations = explode(',', $relations);// 查询 explode } $this->relation();// relation 关系 foreach ($relations as $relation) {// relations as $this->data[$relation] = $this->relation->getRelation($relation); }// 关系 导入 return $this;}/** * 预载入关联查询 返回数据集 * @access public * @param array $resultSet 数据集 * @param string $relation 关联名 * @return array */public function eagerlyResultSet($resultSet, $relation){ return $this->relation()->eagerlyResultSet($resultSet, $relation);}// 预载入关联查询 返回数据集合// 返回关联 结果集