DiverseYouthNightSchool/extend/traits/ModelTrait.php

283 lines
8.6 KiB
PHP
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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