145 lines
5.2 KiB
PHP
145 lines
5.2 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace app\common\model;
|
||
|
|
||
|
use think\Model;
|
||
|
|
||
|
/**
|
||
|
* 基础扩展模型
|
||
|
*/
|
||
|
class BaseModel extends Model
|
||
|
{
|
||
|
|
||
|
|
||
|
public $timeKey = 'createtime';
|
||
|
public static $staticTimeKey = 'createtime';
|
||
|
|
||
|
/**得到基础条件
|
||
|
* @param $status
|
||
|
* @param null $model
|
||
|
* @param string $alisa
|
||
|
*/
|
||
|
public static function getBaseWhere($whereData = [], $model = null, $alisa = '',$with = false)
|
||
|
{
|
||
|
if (!$model) {
|
||
|
$model = new static;
|
||
|
if ($alisa&&!$with) $model = $model->alias($alisa);
|
||
|
}
|
||
|
if ($alisa) $alisa = $alisa . '.';
|
||
|
//$model = $model->where($alisa . 'status', '1');
|
||
|
$tableFields = (new static)->getTableFields();
|
||
|
foreach ($tableFields as $fields)
|
||
|
{
|
||
|
if (isset($whereData[$fields]) && $whereData[$fields]) $model = $model->where("{$alisa}{$fields}", '=', $whereData[$fields]);
|
||
|
}
|
||
|
return $model;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 基础列表
|
||
|
*/
|
||
|
public function getBaseList($whereData = [], $page = 0, $limit = 0, $sort = '',$field =[],$where=[],$toArray = true)
|
||
|
{
|
||
|
$alisa = $this->getWithAlisaName();
|
||
|
if($field){
|
||
|
//如果是一维数组
|
||
|
if(is_array($field)&&count($field) == count($field,1)) $field = ['base'=>$field];
|
||
|
//如果是字符串
|
||
|
if(is_string($field)) $field = ['base'=>explode(',',$field)];
|
||
|
}
|
||
|
$this->withTable = array_keys($field);
|
||
|
$base_i = array_search("base",$this->withTable);
|
||
|
if($base_i!==false)unset($this->withTable[$base_i]);
|
||
|
if(!$this->withTable)$alisa = '';
|
||
|
$alisa_name = '';
|
||
|
if($alisa)$alisa_name = "{$alisa}.";
|
||
|
if(!$sort)$sort = "{$alisa_name}id asc";
|
||
|
$self = static::getBaseWhere($whereData, null, $alisa,true);
|
||
|
if($this->withTable)$self = $self->with($this->withTable);
|
||
|
if($page&&$limit)$self = $self->orderRaw($sort)->where($where)->page($page, $limit);
|
||
|
$list = $self->select();
|
||
|
foreach ($list as $row) {
|
||
|
|
||
|
if(isset($field['base'])&&$field['base']!=['*']){
|
||
|
$row->visible($field['base']);
|
||
|
}else{
|
||
|
$getTableFields = $this->getTableFields();
|
||
|
if(!empty($this->hidden) && is_array($this->hidden)){
|
||
|
$getTableFields = array_diff($getTableFields,$this->hidden);
|
||
|
}
|
||
|
$row->visible($getTableFields);
|
||
|
}
|
||
|
foreach ($this->withTable as $withName) {
|
||
|
if(isset($field[$withName])&&$field[$withName]!=['*']){
|
||
|
$row->visible([$withName]);
|
||
|
$row->getRelation($withName)->visible($field[$withName]);
|
||
|
}elseif(isset($field[$withName])&&$field[$withName]==['*']){
|
||
|
$row->visible([$withName]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
if($toArray)$list = collection($list)->toArray();
|
||
|
$countSelf = static::getBaseWhere($whereData, null, $alisa,true);
|
||
|
if($this->withTable)$countSelf = $countSelf->with($this->withTable);
|
||
|
$count = $countSelf->where($where)->count();
|
||
|
return compact('list', 'count','page','limit');
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
/**
|
||
|
* 时间段搜索器
|
||
|
* @param Model $query
|
||
|
* @param $value
|
||
|
*/
|
||
|
public function scopeTime($query, $value)
|
||
|
{
|
||
|
$timeKey = $this->timeKey;
|
||
|
if(static::$staticTimeKey)$timeKey =static::$staticTimeKey;
|
||
|
switch ($value) {
|
||
|
case 'today':
|
||
|
case 'week':
|
||
|
case 'month':
|
||
|
case 'year':
|
||
|
case 'yesterday':
|
||
|
case 'last year':
|
||
|
case 'last week':
|
||
|
case 'last month':
|
||
|
$query->whereTime($timeKey, $value);
|
||
|
break;
|
||
|
case 'quarter':
|
||
|
list($startTime, $endTime) = static::getMonth();
|
||
|
$query->whereTime($timeKey, 'between', [$startTime, $endTime]);
|
||
|
break;
|
||
|
case 'lately7':
|
||
|
$query->whereTime($timeKey, 'between', [strtotime("-7 day"), time()]);
|
||
|
break;
|
||
|
case 'lately30':
|
||
|
$query->whereTime($timeKey, 'between', [strtotime("-30 day"), time()]);
|
||
|
break;
|
||
|
default:
|
||
|
if (strstr($value, '---') !== false||strstr($value, '-') !== false) {
|
||
|
if(strstr($value, '---') !== false){
|
||
|
[$startTime, $endTime] = explode('---', $value);
|
||
|
}elseif (strstr($value, '-') !== false){
|
||
|
[$startTime, $endTime] = explode('-', $value);
|
||
|
}
|
||
|
$startTime = trim($startTime);
|
||
|
$endTime = trim($endTime);
|
||
|
if ($startTime && $endTime) {
|
||
|
$query->whereTime($timeKey, 'between', [strtotime($startTime), $startTime == $endTime ? strtotime($endTime) + 86400 : strtotime($endTime)]);
|
||
|
} else if (!$startTime && $endTime) {
|
||
|
$query->whereTime($timeKey, '<', strtotime($endTime) + 86400);
|
||
|
} else if ($startTime && !$endTime) {
|
||
|
$query->whereTime($timeKey, '>=', strtotime($startTime));
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|