新版文化云后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

298 lines
8.0 KiB

<?php
// +----------------------------------------------------------------------
// | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2017~2023 https://www.yiovo.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
// +----------------------------------------------------------------------
// | Author: 萤火科技 <admin@yiovo.com>
// +----------------------------------------------------------------------
declare (strict_types=1);
namespace cores;
use think\Model;
use think\db\Query;
use cores\traits\ErrorTrait;
/**
* 模型基类
* Class BaseModel
* @package app\common\model
*/
abstract class BaseModel extends Model
{
use ErrorTrait;
// 当前访问的商城ID
public static $storeId;
// 定义表名
protected $name;
// 模型别名
protected $alias = '';
// 定义全局的查询范围
protected $globalScope = ['store_id'];
// 是否允许全局查询store_id
protected $isGlobalScopeStoreId = true;
// 错误信息
protected $error = '';
/**
* 模型基类初始化
*/
public static function init()
{
parent::init();
// 绑定store_id
self::getStoreId();
}
/**
* 查找单条记录
* @param $data
* @param array $with
* @return array|false|static|null
*/
public static function get($data, array $with = [])
{
try {
$query = (new static)->with($with);
return is_array($data) ? $query->where($data)->find() : $query->find((int)$data);
} catch (\Exception $e) {
return false;
}
}
/**
* 定义全局的查询范围
* @param Query $query
* @return bool
*/
public function scopeStore_id(Query $query): bool
{
if (!$this->isGlobalScopeStoreId) return false;
$storeId = self::getStoreId();
$storeId > 0 && $query->where($query->getTable() . '.store_id', $storeId);
return true;
}
/**
* 获取当前操作的商城ID
* @return int|null
*/
private static function getStoreId(): ?int
{
if (empty(self::$storeId) && in_array(app_name(), ['store', 'api'])) {
self::$storeId = getStoreId();
}
return self::$storeId;
}
/**
* 获取当前调用来源的应用名称
* 例如:admin, api, store, task
* @return string|bool
*/
protected static function getCalledModule()
{
if (preg_match('/app\\\(\w+)/', get_called_class(), $class)) {
return $class[1];
}
return 'common';
}
/**
* 设置默认的检索数据
* @param array $query
* @param array $default
* @return array
*/
protected function setQueryDefaultValue(array $query, array $default = []): array
{
$data = array_merge($default, $query);
foreach ($query as $field => $value) {
// 不存在默认值跳出循环
if (!isset($default[$field])) continue;
// 如果传参为空, 设置默认值
if (empty($value) && $value !== '0') {
$data[$field] = $default[$field];
}
}
return $data;
}
/**
* 设置基础查询条件(用于简化基础alias和field)
* @test 2019-4-25
* @param string $alias
* @param array $join
* @return static
*/
public function setBaseQuery(string $alias = '', array $join = [])
{
// 设置别名
$aliasValue = $alias ?: $this->alias;
$query = $this->alias($aliasValue)->field("{$aliasValue}.*");
// join条件
if (!empty($join)) : foreach ($join as $item):
$query->join($item[0], "{$item[0]}.{$item[1]}={$aliasValue}." . ($item[2] ?? $item[1]));
endforeach; endif;
return $query;
}
/**
* 更新数据
* 重写\think\Model::update方法, 目的可以返回更新的状态bool
* @access public
* @param array $data 数据数组
* @param array $where 更新条件
* @param array $allowField 允许字段
* @return bool
*/
public static function updateBase(array $data, array $where = [], array $allowField = []): bool
{
$model = new static;
if (!empty($allowField)) {
$model->allowField($allowField);
}
if (!empty($where)) {
$model->setUpdateWhere($where);
}
return $model->exists(true)->save($data);
}
/**
* 批量更新数据(支持带where条件)
* @param iterable $dataSet [0 => ['data'=>[], 'where'=>[]]]
* @return array|false
*/
public function updateAll(iterable $dataSet)
{
if (empty($dataSet)) {
return false;
}
return $this->transaction(function () use ($dataSet) {
$result = [];
foreach ($dataSet as $key => $item) {
$result[$key] = self::updateBase($item['data'], $item['where']);
}
return $result;
});
}
/**
* 批量新增数据
* @param iterable $dataSet [0 => ['id'=>10001, 'name'=>'wang']]
* @return array|false
*/
public function addAll(iterable $dataSet)
{
if (empty($dataSet)) {
return false;
}
return $this->transaction(function () use ($dataSet) {
$result = [];
foreach ($dataSet as $key => $item) {
$result[$key] = self::create($item, $this->field);
}
return $result;
});
}
/**
* 删除记录
* @param array $where
* 方式1: ['goods_id' => $goodsId]
* 方式2: [
* ['store_user_id', '=', $storeUserId],
* ['role_id', 'in', $deleteRoleIds]
* ]
* @return bool|int 这里实际返回的是数量int
*/
public static function deleteAll(array $where)
{
return (new static)->where($where)->delete();
}
/**
* 字段值增长
* @param array|int|bool $where
* @param string $field
* @param float $step
* @return mixed
*/
protected function setInc($where, string $field, float $step = 1)
{
if (is_numeric($where)) {
$where = [$this->getPk() => (int)$where];
}
return $this->where($where)->inc($field, $step)->update();
}
/**
* 字段值消减
* @param array|int|bool $where
* @param string $field
* @param float $step
* @return mixed
*/
protected function setDec($where, string $field, float $step = 1)
{
if (is_numeric($where)) {
$where = [$this->getPk() => (int)$where];
}
return $this->where($where)->dec($field, $step)->update();
}
/**
* 实例化新查询对象
* @return \think\db\BaseQuery
*/
protected function getNewQuery()
{
return $this->db();
}
/**
* 新增hidden属性
* @param array $hidden
* @return $this
*/
protected function addHidden(array $hidden)
{
$this->hidden = array_merge($this->hidden, $hidden);
return $this;
}
/**
* 生成字段列表(字段加上$alias别名)
* @param string $alias 别名
* @param array $withoutFields 排除的字段
* @return array
*/
protected function getAliasFields(string $alias, array $withoutFields = []): array
{
$fields = array_diff($this->getTableFields(), $withoutFields);
foreach ($fields as &$field) {
$field = "$alias.$field";
}
return $fields;
}
/**
* 获取隐藏的属性
* @param array $hidden
* @return array
*/
public static function getHidden(array $hidden = []): array
{
$model = new static;
return array_merge($model->hidden, $hidden);
}
}