DiverseYouthNightSchool/extend/traits/ModelTrait.php

283 lines
8.6 KiB
PHP
Raw Normal View History

2024-11-04 15:00:20 +08:00
<?php
/**
* 事务块
* @author: JiaoYuKun
* @day: 2019/12/9
*/
namespace traits;
use think\Db;
use think\Loader;
use think\Lang;
trait ModelTrait
{
protected $withTable = [];
/**
* 开启事务
*/
public static function beginTrans()
{
Db::startTrans();
}
/**
* 提交事务
*/
public static function commitTrans()
{
Db::commit();
}
/**
* 关闭事务
*/
public static function rollbackTrans()
{
Db::rollback();
}
/**
* 根据结果提交滚回事务
* @param $res
*/
public static function checkTrans($res)
{
if ($res) {
self::commitTrans();
} else {
self::rollbackTrans();
}
}
public static function check($param,$rule=[],$rule_msg=[])
{
$self= new static;
if(property_exists($self,'rule')){
$rule = array_merge(static::$rule,$rule);
}
if(property_exists($self,'rule_msg')){
$rule_msg = array_merge(static::$rule_msg,$rule_msg);
}
$validate = new \think\Validate($rule, $rule_msg);
$result = $validate->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
* Email776329498@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
* Email776329498@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');
}
}