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');
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
}
|