check($param); if (!$result) { if (method_exists($self, 'setError')) { return self::setError($validate->getError()); } else { throw new \Exception($validate->getError()); } } return true; } /** * 设置异常 * @param string $errorMsg * @return bool */ protected static function setException($errorMsg = "操作失败,请稍候再试!") { throw new \Exception($errorMsg); } /** * 带有乐观锁的修改 * Power: Mikkle * Email:776329498@qq.com * @param $save_data   修改的数据 * @param string $edit_pk 修改的ID字段名称 * @param string $version_field  乐观锁版本号字段名称 * @return array */ public function editDateWithLock($save_data,$edit_pk="",$version_field=""){ if (empty($version_field)){ $version_field = isset($this->versionField) ? $this->versionField : "edit_version"; } if (empty($edit_pk)){ $edit_pk = isset($this->editPk) ? $this->editPk : $this->getPk(); } //判断PK字段是否存在 if (!isset($save_data[$edit_pk])||!isset($save_data[$version_field])){ throw new \Exception("参数缺失"); }else{ //设置升级检索条件 PK和版本号 $map[$edit_pk] = $save_data[$edit_pk]; $map[$version_field] = $save_data[$version_field]; //剔除PK unset($save_data[$edit_pk]); } //检测版本字段 if($this->hasColumn($version_field)){ throw new \Exception("乐观锁版本字段[$version_field]不存在"); } $original_data = $this->where($map)->find(); if (empty($original_data)){ throw new \Exception("此条信息已经变动了,请重新操作!"); } foreach ($save_data as $item=>$value){ if (isset($original_data[$item])){ //修改的数值不变时候 剔除 if ($original_data[$item]==$value){ unset( $save_data[$item]); }elseif($item!=$version_field){ unset( $original_data[$item]); } }else{ //修改的字段不存在 剔除 unset( $save_data[$item]); } } if(empty($save_data)){ throw new \Exception("修改的数值无变化"); } //版本号升级 $save_data[$version_field]=(int)$original_data[$version_field]+1; if (1!=$this->allowField(true)->save($save_data,$map)){ throw new \Exception("修改信息出错:".$this->getError()); } return true; } /** * 判断字段是否存在 * Power: Mikkle * Email:776329498@qq.com * @param $column * @param string $table * @return bool */ protected function hasColumn($column,$table=""){ $table = isset($table)?$table:$this->table; if (empty($table)||$column){ $this->error="hasColumn方法参数缺失"; return false; } $sql = "SELECT * FROM information_schema.columns WHERE table_schema=CurrentDatabase AND table_name = '{$table}' AND column_name = '{$column}'"; return $this->query($sql) ? true : false; } public function getWithAlisaName(){ return strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', (new \ReflectionClass(static::class))->getShortName())); } // /**得到基础条件 // * @param $status // * @param null $model // * @param string $alisa // */ // public function getBaseWhere($whereData = [], $model = null, $alisa = '') // { // if (!$model) { // $model = new self; // if ($alisa) $model = $model->alias($alisa); // } // if ($alisa) $alisa = $alisa . '.'; // $model = $model->where($whereData); // return $model; // } // // // /** // * 基础列表 // */ // public function getBaseList($whereData = [], $page = 0, $limit = 0, $sort = '',$field ="*",$where=[],$alisa = '') // { // if ($alisa) $alisa = $alisa . '.'; // if(!$sort)$sort = "{$alisa}id desc"; // $self = $this->getBaseWhere($whereData, null, $alisa)->where($where)->field($field); // if($page&&$limit)$self = $self->page($page, $limit); // $list = $self->orderRaw($sort)->select(); // $count = $this->getBaseWhere($whereData, null, $alisa) // ->where($where) // ->count(); // return compact('list', 'count','page','limit'); // } /** * 获取时间段之间的model * @param int|string $time * @param string $ceil * @return array */ public static function getModelTime($where, $model = null, $prefix = 'add_time', $data = 'data', $field = ' - ') { if ($model == null) $model = new self; if (!isset($where[$data])) return $model; switch ($where[$data]) { case 'today': case 'week': case 'month': case 'year': case 'yesterday': $model = $model->whereTime($prefix, $where[$data]); break; case 'quarter': list($startTime, $endTime) = self::getMonth(); $model = $model->where($prefix, '>', strtotime($startTime)); $model = $model->where($prefix, '<', strtotime($endTime)); break; case 'lately7': $model = $model->where($prefix, 'between time', [strtotime("-7 day"), time()]); break; case 'lately30': $model = $model->where($prefix, 'between time', [strtotime("-30 day"), time()]); break; default: if (strstr($where[$data], $field) !== false) { list($startTime, $endTime) = explode($field, $where[$data]); $model = $model->where($prefix, '>', strtotime($startTime)); $model = $model->where($prefix, '<', bcadd(strtotime($endTime), 86400, 0)); } break; } return $model; } /** * 获取本季度 time * @param int|string $time * @param string $ceil * @return array */ public static function getMonth($time = '', $ceil = 0) { if ($ceil != 0) $season = ceil(date('n') / 3) - $ceil; else $season = ceil(date('n') / 3); $firstday = date('Y-m-01', mktime(0, 0, 0, ($season - 1) * 3 + 1, 1, date('Y'))); $lastday = date('Y-m-t', mktime(0, 0, 0, $season * 3, 1, date('Y'))); return array($firstday, $lastday); } /** * 加载语言文件 * @param string $name */ protected function loadlang($name=null) { if(!$name)$name = str_replace('model/', '', strstr(str_replace('\\', '/', $this->class), 'model/')); $name = Loader::parseName($name); $name_arr = explode('/',$name); $i = count($name_arr)-1; if($name_arr[$i][0]=='_')$name_arr[$i] = substr($name_arr[$i],1); $name = implode("/",$name_arr); Lang::load(APP_PATH . request()->module() . '/lang/' . request()->langset() . '/' . str_replace('.', '/', $name) . '.php'); } }