283 lines
8.6 KiB
PHP
283 lines
8.6 KiB
PHP
<?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
|
||
* 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');
|
||
}
|
||
|
||
|
||
|
||
|
||
} |