| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532 |
- <?php
- // +----------------------------------------------------------------------
- // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
- // +----------------------------------------------------------------------
- // | Author: CRMEB Team <admin@crmeb.com>
- // +----------------------------------------------------------------------
- namespace app\common\dao;
- use app\common\model\BaseModel;
- use Carbon\Carbon;
- use crmeb\services\crud\CrudFormEnum;
- use think\Collection;
- use think\db\Builder;
- use think\db\exception\DataNotFoundException;
- use think\db\exception\DbException;
- use think\db\exception\ModelNotFoundException;
- use think\db\Query;
- use think\Model;
- use crmeb\services\crud\CrudOperatorEnum;
- /**
- * Class BaseDao
- * @package app\common\dao
- * @author xaboy
- * @day 2020-03-30
- */
- abstract class BaseDao
- {
- /**
- * @return BaseModel
- * @author xaboy
- * @day 2020-03-30
- */
- abstract protected function getModel(): string;
- /**
- * @return string
- * @author xaboy
- * @day 2020-03-30
- */
- public function getPk()
- {
- return ($this->getModel())::tablePk();
- }
- /**
- * @param int $id
- * @return bool
- * @author xaboy
- * @day 2020-03-27
- */
- public function exists(int $id)
- {
- return $this->fieldExists($this->getPk(), $id);
- }
- public function merInExists(int $merId, $ids)
- {
- $pk = ($this->getModel())::getDB()->where('mer_id',$merId)->where($this->getPk(),'in',$ids)->column($this->getPk());
- $ids = is_array($ids) ? $ids : explode(',',$ids);
- sort($ids);
- sort($pk);
- return $ids == $pk;
- }
- /**
- * @param array $where
- * @return BaseModel
- */
- public function query(array $where):Query
- {
- return ($this->getModel())::getInstance()->where($where);
- }
- /**
- * @param $field
- * @param $value
- * @param int|null $except
- * @return bool
- * @author xaboy
- * @day 2020-03-30
- */
- public function fieldExists($field, $value, ?int $except = null): bool
- {
- $query = ($this->getModel())::getDB()->where($field, $value);
- if (!is_null($except)) $query->where($this->getPk(), '<>', $except);
- return $query->count() > 0;
- }
- /**
- * @param array $data
- * @return self|Model
- * @author xaboy
- * @day 2020-03-27
- */
- public function create(array $data)
- {
- return ($this->getModel())::create($data);
- }
- /**
- * @param int $id
- * @param array $data
- * @return int
- * @throws DbException
- * @author xaboy
- * @day 2020-03-27
- */
- public function update(int $id, array $data)
- {
- return ($this->getModel())::getDB()->where($this->getPk(), $id)->update($data);
- }
- /**
- * @param array $ids
- * @param array $data
- * @return int
- * @throws DbException
- * @author xaboy
- * @day 2020/6/8
- */
- public function updates(array $ids, array $data)
- {
- return ($this->getModel())::getDB()->whereIn($this->getPk(), $ids)->update($data);
- }
- /**
- * @param int $id
- * @return int
- * @throws DbException
- * @author xaboy
- * @day 2020-03-27
- */
- public function delete(int $id)
- {
- return ($this->getModel())::getDB()->where($this->getPk(), $id)->delete();
- }
- /**
- * @param int $id
- * @return array|Model|null
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- * @author xaboy
- * @day 2020-03-27
- */
- public function get($id)
- {
- return ($this->getModel())::getInstance()->find($id);
- }
- /**
- * @param array $where
- * @param string $field
- * @return array|Model|null
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- * @author xaboy
- * @day 2020/6/1
- */
- public function getWhere(array $where, string $field = '*', array $with = [])
- {
- return ($this->getModel())::getInstance()->where($where)->when($with, function ($query) use ($with) {
- $query->with($with);
- })->field($field)->find();
- }
- /**
- * @param array $where
- * @param string $field
- * @return Collection
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- * @author xaboy
- * @day 2020/6/1
- */
- public function selectWhere(array $where, string $field = '*')
- {
- return ($this->getModel())::getInstance()->where($where)->field($field)->select();
- }
- /**
- * @param int $id
- * @param array $with
- * @return array|Model|null
- * @throws DataNotFoundException
- * @throws DbException
- * @throws ModelNotFoundException
- * @author xaboy
- * @day 2020-03-27
- */
- public function getWith(int $id, $with = [])
- {
- return ($this->getModel())::getInstance()->with($with)->find($id);
- }
- /**
- * @param array $data
- * @return int
- * @author xaboy
- * @day 2020/6/8
- */
- public function insertAll(array $data)
- {
- return ($this->getModel())::getDB()->insertAll($data);
- }
- /**
- * 通过条件判断是否存在
- * @param array $where
- * @author Qinii
- * @day 2020-06-13
- */
- public function getWhereCount(array $where)
- {
- return ($this->getModel()::getDB())->where($where)->count();
- }
- public function existsWhere($where)
- {
- return ($this->getModel())::getDB()->where($where)->count() > 0;
- }
- /**
- * 查询,如果不存在就创建
- * @Author:Qinii
- * @Date: 2020/9/8
- * @param array $where
- * @return array|Model|null
- */
- public function findOrCreate(array $where)
- {
- $res = ($this->getModel()::getDB())->where($where)->find();
- if(!$res)$res = $this->getModel()::create($where);
- return $res;
- }
- /**
- * 搜索
- * @param $where
- * @return BaseModel
- * @author Qinii
- * @day 2020-10-16
- */
- public function getSearch(array $where)
- {
- foreach ($where as $key => $item) {
- if ($item !== '') {
- $keyArray[] = $key;
- $whereArr[$key] = $item;
- }
- }
- if(empty($keyArray)){
- return ($this->getModel())::getDB();
- }else{
- return ($this->getModel())::withSearch($keyArray, $whereArr);
- }
- }
- /**
- * 自增
- * @param array $id
- * @param string $field
- * @param int $num
- * @return mixed
- * @author Qinii
- * @day 1/11/21
- */
- public function incField(int $id, string $field , $num = 1)
- {
- return ($this->getModel()::getDB())->where($this->getPk(),$id)->inc($field,$num)->update();
- }
- /**
- * 自减
- * @param array $id
- * @param string $field
- * @param int $num
- * @return mixed
- * @author Qinii
- * @day 1/11/21
- */
- public function decField(int $id, string $field , $num = 1)
- {
- return ($this->getModel()::getDB())
- ->where($this->getPk(),$id)
- ->where($field, '>=' ,$num)
- ->dec($field,$num)->update();
- }
- public function merHas(int $merId, int $id, ?int $isDel = 0)
- {
- return ($this->getModel()::getDB())->where($this->getPk(), $id)->where('mer_id', $merId)
- ->when(!is_null($isDel), function($query) use($isDel) {
- $query->where('is_del', $isDel);
- })->count($this->getPk()) > 0;
- }
- public function viewSearch(array $viewSearch = [], $query = null, string $defaulAlias = '')
- {
- if (is_null($query)) {
- $query = $this->getModel();
- }
- if(empty($viewSearch) || !isset($viewSearch[0]['boolean'])) return $query;
- $logic = $viewSearch[0]['boolean'] == 'and' ? 'where' : 'whereOr';
- $query = $query->where(function (Query $query) use ($viewSearch, $logic, $defaulAlias) {
- foreach ($viewSearch as $search) {
- if (empty($search['field_name']) || empty($search['operator'])) {
- continue;
- }
- if (!isset($search['value'])) {
- $search['value'] = '';
- }
- if (strstr($search['field_name'], '.') !== false) {
- $fieldName = $search['field_name'];
- } else {
- $alias = $item['alias'] ?? $defaulAlias;
- $fieldName = ($alias ? $alias . '.' : '') . $search['field_name'];
- }
- $query->{$logic}(function(Query $query) use($search, $fieldName){
- switch ($search['operator']) {
- case CrudOperatorEnum::OPERATOR_IN :
- if (isset($search['form_value'])) {
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_INPUT:
- case CrudFormEnum::FORM_TEXTAREA:
- if (is_array($search['value'])) {
- $search['value'] = json_encode($search['value']);
- }
- $query = $query->where($fieldName, 'LIKE', '%' . $search['value'] . '%');
- break;
- case CrudFormEnum::FORM_TAG:
- case CrudFormEnum::FORM_CHECKBOX:
- case CrudFormEnum::FORM_CASCADER_ADDRESS:
- $tags = is_array($search['value']) ? $search['value'] : explode(',', $search['value']);
- $query = $query->where(function ($query) use ($tags, $fieldName) {
- foreach ($tags as $i => $tag) {
- if ($i) {
- $query->whereOr($fieldName, 'like', '%/' . $tag . '/%');
- } else {
- $query->where($fieldName, 'like', '%/' . $tag . '/%');
- }
- }
- });
- break;
- case CrudFormEnum::FORM_CASCADER_RADIO:
- $query = $query->where(function ($query) use ($search, $fieldName) {
- foreach ($search['value'] as $i => $val) {
- $val = implode('/', $val);
- if ($i) {
- $query->whereOr($fieldName, 'like', '%/' . $val . '/%');
- } else {
- $query->where($fieldName, 'like', '%/' . $val . '/%');
- }
- }
- });
- break;
- default:
- $query = $query->whereIn($fieldName, is_array($search['value']) ? $search['value'] : explode(',',$search['value']));
- break;
- }
- } else {
- $query = $query->whereIn($fieldName, is_array($search['value']) ? $search['value'] : [$search['value']]);
- }
- break;
- case CrudOperatorEnum::OPERATOR_NOT_IN:
- if (isset($search['form_value'])) {
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_INPUT:
- case CrudFormEnum::FORM_TEXTAREA:
- if (is_array($search['value'])) {
- $search['value'] = json_encode($search['value']);
- }
- $query = $query->whereNot($fieldName, 'LIKE', '%' . $search['value'] . '%');
- break;
- case CrudFormEnum::FORM_CASCADER_RADIO:
- $query = $query->whereNot(function ($query) use ($search, $fieldName) {
- foreach ($search['value'] as $i => $val) {
- $val = implode('/', $val);
- if ($i) {
- $query->whereOr($fieldName, 'like', '%/' . $val . '/%');
- } else {
- $query->where($fieldName, 'like', '%/' . $val . '/%');
- }
- }
- });
- break;
- case CrudFormEnum::FORM_TAG:
- case CrudFormEnum::FORM_CHECKBOX:
- case CrudFormEnum::FORM_CASCADER_ADDRESS:
- $tags = is_array($search['value']) ? $search['value'] : explode(',', $search['value']);
- $query = $query->whereNot(function ($query) use ($tags, $fieldName) {
- foreach ($tags as $i => $tag) {
- if ($i) {
- $query->whereOr($fieldName, 'like', '%/' . $tag . '/%');
- } else {
- $query->where($fieldName, 'like', '%/' . $tag . '/%');
- }
- }
- });
- break;
- default:
- $query = $query->whereIn($fieldName, is_array($search['value']) ? $search['value'] : [$search['value']]);
- break;
- }
- } else {
- $query = $query->whereNotIn($fieldName, is_array($search['value']) ? $search['value'] : [$search['value']]);
- }
- break;
- case CrudOperatorEnum::OPERATOR_EQ:
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_DATE_TIME_PICKER:
- $query = $query->whereDay($fieldName,$search['value']);
- break;
- default:
- $query = $query->where($fieldName, $search['value']);
- break;
- }
- break;
- case CrudOperatorEnum::OPERATOR_GT:
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_DATE_TIME_PICKER:
- $query = $query->whereTime($fieldName,'>', $search['value'].'23:59:59');
- break;
- default:
- $query = $query->where($fieldName,'>', $search['value']);
- break;
- }
- break;
- case CrudOperatorEnum::OPERATOR_GT_EQ:
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_DATE_TIME_PICKER:
- $query = $query->whereTime($fieldName,'>=', $search['value']);
- break;
- default:
- $query = $query->where($fieldName, '>=', $search['value']);
- break;
- }
- break;
- case CrudOperatorEnum::OPERATOR_LT:
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_DATE_TIME_PICKER:
- $query = $query->whereTime($fieldName,'<', $search['value']);
- break;
- default:
- $query = $query->where($fieldName, '<', $search['value']);
- break;
- }
- break;
- case CrudOperatorEnum::OPERATOR_LT_EQ:
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_DATE_TIME_PICKER:
- $query = $query->whereTime($fieldName,'<=', $search['value']. ' 23:59:59');
- break;
- default:
- $query = $query->where($fieldName, '<=', $search['value']);
- break;
- }
- break;
- case CrudOperatorEnum::OPERATOR_NOT_EQ:
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_DATE_TIME_PICKER:
- $query = $query->whereNotBetweenTime($fieldName, $search['value'], $search['value'].' 23:59:59');
- break;
- default:
- $query = $query->where($fieldName, '<>', $search['value']);
- break;
- }
- break;
- case CrudOperatorEnum::OPERATOR_IS_EMPTY:
- $query = $query->whereNull($fieldName);
- break;
- case CrudOperatorEnum::OPERATOR_NOT_EMPTY:
- $query = $query->whereNotNull($fieldName);
- break;
- case CrudOperatorEnum::OPERATOR_BT:
- switch ($search['form_value']) {
- case CrudFormEnum::FORM_DATE_TIME_PICKER:
- [$startTime,$endTime] = explode('-', $search['value']);
- $query = $query->whereBetweenTime($fieldName, $startTime,$endTime.' 23:59:59');
- break;
- default:
- $query = $query->whereBetween($fieldName, $search['value']);
- break;
- }
- break;
- case CrudOperatorEnum::OPERATOR_N_DAY:
- $query = $query->whereTime($fieldName, '<', Carbon::today()->subDays((int)$search['value'])->toDateTimeString());
- break;
- case CrudOperatorEnum::OPERATOR_LAST_DAY:
- $query = $query->whereBetweenTime($fieldName, Carbon::today()->subDays((int)$search['value'])->toDateTimeString(), Carbon::today()->toDateTimeString());
- break;
- case CrudOperatorEnum::OPERATOR_NEXT_DAY:
- $query = $query->whereBetweenTime($fieldName, Carbon::today()->toDateTimeString(), Carbon::today()->addDays((int)$search['value'])->toDateTimeString());
- break;
- case CrudOperatorEnum::OPERATOR_TO_DAY:
- $query = $query->whereTime($fieldName, Carbon::today()->toDateString());
- break;
- case CrudOperatorEnum::OPERATOR_WEEK:
- $query = $query->whereWeek($fieldName);
- break;
- case CrudOperatorEnum::OPERATOR_MONTH:
- $query = $query->whereMonth($fieldName);
- break;
- case CrudOperatorEnum::OPERATOR_QUARTER:
- $query = $query->whereBetweenTime($fieldName, Carbon::today()->startOfQuarter()->toDateTimeString(), Carbon::today()->endOfQuarter()->toDateTimeString());
- break;
- }
- });
- }
- });
- return $query;
- }
- }
|