BaseDao.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\dao;
  12. use app\common\model\BaseModel;
  13. use Carbon\Carbon;
  14. use crmeb\services\crud\CrudFormEnum;
  15. use think\Collection;
  16. use think\db\Builder;
  17. use think\db\exception\DataNotFoundException;
  18. use think\db\exception\DbException;
  19. use think\db\exception\ModelNotFoundException;
  20. use think\db\Query;
  21. use think\Model;
  22. use crmeb\services\crud\CrudOperatorEnum;
  23. /**
  24. * Class BaseDao
  25. * @package app\common\dao
  26. * @author xaboy
  27. * @day 2020-03-30
  28. */
  29. abstract class BaseDao
  30. {
  31. /**
  32. * @return BaseModel
  33. * @author xaboy
  34. * @day 2020-03-30
  35. */
  36. abstract protected function getModel(): string;
  37. /**
  38. * @return string
  39. * @author xaboy
  40. * @day 2020-03-30
  41. */
  42. public function getPk()
  43. {
  44. return ($this->getModel())::tablePk();
  45. }
  46. /**
  47. * @param int $id
  48. * @return bool
  49. * @author xaboy
  50. * @day 2020-03-27
  51. */
  52. public function exists(int $id)
  53. {
  54. return $this->fieldExists($this->getPk(), $id);
  55. }
  56. public function merInExists(int $merId, $ids)
  57. {
  58. $pk = ($this->getModel())::getDB()->where('mer_id',$merId)->where($this->getPk(),'in',$ids)->column($this->getPk());
  59. $ids = is_array($ids) ? $ids : explode(',',$ids);
  60. sort($ids);
  61. sort($pk);
  62. return $ids == $pk;
  63. }
  64. /**
  65. * @param array $where
  66. * @return BaseModel
  67. */
  68. public function query(array $where):Query
  69. {
  70. return ($this->getModel())::getInstance()->where($where);
  71. }
  72. /**
  73. * @param $field
  74. * @param $value
  75. * @param int|null $except
  76. * @return bool
  77. * @author xaboy
  78. * @day 2020-03-30
  79. */
  80. public function fieldExists($field, $value, ?int $except = null): bool
  81. {
  82. $query = ($this->getModel())::getDB()->where($field, $value);
  83. if (!is_null($except)) $query->where($this->getPk(), '<>', $except);
  84. return $query->count() > 0;
  85. }
  86. /**
  87. * @param array $data
  88. * @return self|Model
  89. * @author xaboy
  90. * @day 2020-03-27
  91. */
  92. public function create(array $data)
  93. {
  94. return ($this->getModel())::create($data);
  95. }
  96. /**
  97. * @param int $id
  98. * @param array $data
  99. * @return int
  100. * @throws DbException
  101. * @author xaboy
  102. * @day 2020-03-27
  103. */
  104. public function update(int $id, array $data)
  105. {
  106. return ($this->getModel())::getDB()->where($this->getPk(), $id)->update($data);
  107. }
  108. /**
  109. * @param array $ids
  110. * @param array $data
  111. * @return int
  112. * @throws DbException
  113. * @author xaboy
  114. * @day 2020/6/8
  115. */
  116. public function updates(array $ids, array $data)
  117. {
  118. return ($this->getModel())::getDB()->whereIn($this->getPk(), $ids)->update($data);
  119. }
  120. /**
  121. * @param int $id
  122. * @return int
  123. * @throws DbException
  124. * @author xaboy
  125. * @day 2020-03-27
  126. */
  127. public function delete(int $id)
  128. {
  129. return ($this->getModel())::getDB()->where($this->getPk(), $id)->delete();
  130. }
  131. /**
  132. * @param int $id
  133. * @return array|Model|null
  134. * @throws DataNotFoundException
  135. * @throws DbException
  136. * @throws ModelNotFoundException
  137. * @author xaboy
  138. * @day 2020-03-27
  139. */
  140. public function get($id)
  141. {
  142. return ($this->getModel())::getInstance()->find($id);
  143. }
  144. /**
  145. * @param array $where
  146. * @param string $field
  147. * @return array|Model|null
  148. * @throws DataNotFoundException
  149. * @throws DbException
  150. * @throws ModelNotFoundException
  151. * @author xaboy
  152. * @day 2020/6/1
  153. */
  154. public function getWhere(array $where, string $field = '*', array $with = [])
  155. {
  156. return ($this->getModel())::getInstance()->where($where)->when($with, function ($query) use ($with) {
  157. $query->with($with);
  158. })->field($field)->find();
  159. }
  160. /**
  161. * @param array $where
  162. * @param string $field
  163. * @return Collection
  164. * @throws DataNotFoundException
  165. * @throws DbException
  166. * @throws ModelNotFoundException
  167. * @author xaboy
  168. * @day 2020/6/1
  169. */
  170. public function selectWhere(array $where, string $field = '*')
  171. {
  172. return ($this->getModel())::getInstance()->where($where)->field($field)->select();
  173. }
  174. /**
  175. * @param int $id
  176. * @param array $with
  177. * @return array|Model|null
  178. * @throws DataNotFoundException
  179. * @throws DbException
  180. * @throws ModelNotFoundException
  181. * @author xaboy
  182. * @day 2020-03-27
  183. */
  184. public function getWith(int $id, $with = [])
  185. {
  186. return ($this->getModel())::getInstance()->with($with)->find($id);
  187. }
  188. /**
  189. * @param array $data
  190. * @return int
  191. * @author xaboy
  192. * @day 2020/6/8
  193. */
  194. public function insertAll(array $data)
  195. {
  196. return ($this->getModel())::getDB()->insertAll($data);
  197. }
  198. /**
  199. * 通过条件判断是否存在
  200. * @param array $where
  201. * @author Qinii
  202. * @day 2020-06-13
  203. */
  204. public function getWhereCount(array $where)
  205. {
  206. return ($this->getModel()::getDB())->where($where)->count();
  207. }
  208. public function existsWhere($where)
  209. {
  210. return ($this->getModel())::getDB()->where($where)->count() > 0;
  211. }
  212. /**
  213. * 查询,如果不存在就创建
  214. * @Author:Qinii
  215. * @Date: 2020/9/8
  216. * @param array $where
  217. * @return array|Model|null
  218. */
  219. public function findOrCreate(array $where)
  220. {
  221. $res = ($this->getModel()::getDB())->where($where)->find();
  222. if(!$res)$res = $this->getModel()::create($where);
  223. return $res;
  224. }
  225. /**
  226. * 搜索
  227. * @param $where
  228. * @return BaseModel
  229. * @author Qinii
  230. * @day 2020-10-16
  231. */
  232. public function getSearch(array $where)
  233. {
  234. foreach ($where as $key => $item) {
  235. if ($item !== '') {
  236. $keyArray[] = $key;
  237. $whereArr[$key] = $item;
  238. }
  239. }
  240. if(empty($keyArray)){
  241. return ($this->getModel())::getDB();
  242. }else{
  243. return ($this->getModel())::withSearch($keyArray, $whereArr);
  244. }
  245. }
  246. /**
  247. * 自增
  248. * @param array $id
  249. * @param string $field
  250. * @param int $num
  251. * @return mixed
  252. * @author Qinii
  253. * @day 1/11/21
  254. */
  255. public function incField(int $id, string $field , $num = 1)
  256. {
  257. return ($this->getModel()::getDB())->where($this->getPk(),$id)->inc($field,$num)->update();
  258. }
  259. /**
  260. * 自减
  261. * @param array $id
  262. * @param string $field
  263. * @param int $num
  264. * @return mixed
  265. * @author Qinii
  266. * @day 1/11/21
  267. */
  268. public function decField(int $id, string $field , $num = 1)
  269. {
  270. return ($this->getModel()::getDB())
  271. ->where($this->getPk(),$id)
  272. ->where($field, '>=' ,$num)
  273. ->dec($field,$num)->update();
  274. }
  275. public function merHas(int $merId, int $id, ?int $isDel = 0)
  276. {
  277. return ($this->getModel()::getDB())->where($this->getPk(), $id)->where('mer_id', $merId)
  278. ->when(!is_null($isDel), function($query) use($isDel) {
  279. $query->where('is_del', $isDel);
  280. })->count($this->getPk()) > 0;
  281. }
  282. public function viewSearch(array $viewSearch = [], $query = null, string $defaulAlias = '')
  283. {
  284. if (is_null($query)) {
  285. $query = $this->getModel();
  286. }
  287. if(empty($viewSearch) || !isset($viewSearch[0]['boolean'])) return $query;
  288. $logic = $viewSearch[0]['boolean'] == 'and' ? 'where' : 'whereOr';
  289. $query = $query->where(function (Query $query) use ($viewSearch, $logic, $defaulAlias) {
  290. foreach ($viewSearch as $search) {
  291. if (empty($search['field_name']) || empty($search['operator'])) {
  292. continue;
  293. }
  294. if (!isset($search['value'])) {
  295. $search['value'] = '';
  296. }
  297. if (strstr($search['field_name'], '.') !== false) {
  298. $fieldName = $search['field_name'];
  299. } else {
  300. $alias = $item['alias'] ?? $defaulAlias;
  301. $fieldName = ($alias ? $alias . '.' : '') . $search['field_name'];
  302. }
  303. $query->{$logic}(function(Query $query) use($search, $fieldName){
  304. switch ($search['operator']) {
  305. case CrudOperatorEnum::OPERATOR_IN :
  306. if (isset($search['form_value'])) {
  307. switch ($search['form_value']) {
  308. case CrudFormEnum::FORM_INPUT:
  309. case CrudFormEnum::FORM_TEXTAREA:
  310. if (is_array($search['value'])) {
  311. $search['value'] = json_encode($search['value']);
  312. }
  313. $query = $query->where($fieldName, 'LIKE', '%' . $search['value'] . '%');
  314. break;
  315. case CrudFormEnum::FORM_TAG:
  316. case CrudFormEnum::FORM_CHECKBOX:
  317. case CrudFormEnum::FORM_CASCADER_ADDRESS:
  318. $tags = is_array($search['value']) ? $search['value'] : explode(',', $search['value']);
  319. $query = $query->where(function ($query) use ($tags, $fieldName) {
  320. foreach ($tags as $i => $tag) {
  321. if ($i) {
  322. $query->whereOr($fieldName, 'like', '%/' . $tag . '/%');
  323. } else {
  324. $query->where($fieldName, 'like', '%/' . $tag . '/%');
  325. }
  326. }
  327. });
  328. break;
  329. case CrudFormEnum::FORM_CASCADER_RADIO:
  330. $query = $query->where(function ($query) use ($search, $fieldName) {
  331. foreach ($search['value'] as $i => $val) {
  332. $val = implode('/', $val);
  333. if ($i) {
  334. $query->whereOr($fieldName, 'like', '%/' . $val . '/%');
  335. } else {
  336. $query->where($fieldName, 'like', '%/' . $val . '/%');
  337. }
  338. }
  339. });
  340. break;
  341. default:
  342. $query = $query->whereIn($fieldName, is_array($search['value']) ? $search['value'] : explode(',',$search['value']));
  343. break;
  344. }
  345. } else {
  346. $query = $query->whereIn($fieldName, is_array($search['value']) ? $search['value'] : [$search['value']]);
  347. }
  348. break;
  349. case CrudOperatorEnum::OPERATOR_NOT_IN:
  350. if (isset($search['form_value'])) {
  351. switch ($search['form_value']) {
  352. case CrudFormEnum::FORM_INPUT:
  353. case CrudFormEnum::FORM_TEXTAREA:
  354. if (is_array($search['value'])) {
  355. $search['value'] = json_encode($search['value']);
  356. }
  357. $query = $query->whereNot($fieldName, 'LIKE', '%' . $search['value'] . '%');
  358. break;
  359. case CrudFormEnum::FORM_CASCADER_RADIO:
  360. $query = $query->whereNot(function ($query) use ($search, $fieldName) {
  361. foreach ($search['value'] as $i => $val) {
  362. $val = implode('/', $val);
  363. if ($i) {
  364. $query->whereOr($fieldName, 'like', '%/' . $val . '/%');
  365. } else {
  366. $query->where($fieldName, 'like', '%/' . $val . '/%');
  367. }
  368. }
  369. });
  370. break;
  371. case CrudFormEnum::FORM_TAG:
  372. case CrudFormEnum::FORM_CHECKBOX:
  373. case CrudFormEnum::FORM_CASCADER_ADDRESS:
  374. $tags = is_array($search['value']) ? $search['value'] : explode(',', $search['value']);
  375. $query = $query->whereNot(function ($query) use ($tags, $fieldName) {
  376. foreach ($tags as $i => $tag) {
  377. if ($i) {
  378. $query->whereOr($fieldName, 'like', '%/' . $tag . '/%');
  379. } else {
  380. $query->where($fieldName, 'like', '%/' . $tag . '/%');
  381. }
  382. }
  383. });
  384. break;
  385. default:
  386. $query = $query->whereIn($fieldName, is_array($search['value']) ? $search['value'] : [$search['value']]);
  387. break;
  388. }
  389. } else {
  390. $query = $query->whereNotIn($fieldName, is_array($search['value']) ? $search['value'] : [$search['value']]);
  391. }
  392. break;
  393. case CrudOperatorEnum::OPERATOR_EQ:
  394. switch ($search['form_value']) {
  395. case CrudFormEnum::FORM_DATE_TIME_PICKER:
  396. $query = $query->whereDay($fieldName,$search['value']);
  397. break;
  398. default:
  399. $query = $query->where($fieldName, $search['value']);
  400. break;
  401. }
  402. break;
  403. case CrudOperatorEnum::OPERATOR_GT:
  404. switch ($search['form_value']) {
  405. case CrudFormEnum::FORM_DATE_TIME_PICKER:
  406. $query = $query->whereTime($fieldName,'>', $search['value'].'23:59:59');
  407. break;
  408. default:
  409. $query = $query->where($fieldName,'>', $search['value']);
  410. break;
  411. }
  412. break;
  413. case CrudOperatorEnum::OPERATOR_GT_EQ:
  414. switch ($search['form_value']) {
  415. case CrudFormEnum::FORM_DATE_TIME_PICKER:
  416. $query = $query->whereTime($fieldName,'>=', $search['value']);
  417. break;
  418. default:
  419. $query = $query->where($fieldName, '>=', $search['value']);
  420. break;
  421. }
  422. break;
  423. case CrudOperatorEnum::OPERATOR_LT:
  424. switch ($search['form_value']) {
  425. case CrudFormEnum::FORM_DATE_TIME_PICKER:
  426. $query = $query->whereTime($fieldName,'<', $search['value']);
  427. break;
  428. default:
  429. $query = $query->where($fieldName, '<', $search['value']);
  430. break;
  431. }
  432. break;
  433. case CrudOperatorEnum::OPERATOR_LT_EQ:
  434. switch ($search['form_value']) {
  435. case CrudFormEnum::FORM_DATE_TIME_PICKER:
  436. $query = $query->whereTime($fieldName,'<=', $search['value']. ' 23:59:59');
  437. break;
  438. default:
  439. $query = $query->where($fieldName, '<=', $search['value']);
  440. break;
  441. }
  442. break;
  443. case CrudOperatorEnum::OPERATOR_NOT_EQ:
  444. switch ($search['form_value']) {
  445. case CrudFormEnum::FORM_DATE_TIME_PICKER:
  446. $query = $query->whereNotBetweenTime($fieldName, $search['value'], $search['value'].' 23:59:59');
  447. break;
  448. default:
  449. $query = $query->where($fieldName, '<>', $search['value']);
  450. break;
  451. }
  452. break;
  453. case CrudOperatorEnum::OPERATOR_IS_EMPTY:
  454. $query = $query->whereNull($fieldName);
  455. break;
  456. case CrudOperatorEnum::OPERATOR_NOT_EMPTY:
  457. $query = $query->whereNotNull($fieldName);
  458. break;
  459. case CrudOperatorEnum::OPERATOR_BT:
  460. switch ($search['form_value']) {
  461. case CrudFormEnum::FORM_DATE_TIME_PICKER:
  462. [$startTime,$endTime] = explode('-', $search['value']);
  463. $query = $query->whereBetweenTime($fieldName, $startTime,$endTime.' 23:59:59');
  464. break;
  465. default:
  466. $query = $query->whereBetween($fieldName, $search['value']);
  467. break;
  468. }
  469. break;
  470. case CrudOperatorEnum::OPERATOR_N_DAY:
  471. $query = $query->whereTime($fieldName, '<', Carbon::today()->subDays((int)$search['value'])->toDateTimeString());
  472. break;
  473. case CrudOperatorEnum::OPERATOR_LAST_DAY:
  474. $query = $query->whereBetweenTime($fieldName, Carbon::today()->subDays((int)$search['value'])->toDateTimeString(), Carbon::today()->toDateTimeString());
  475. break;
  476. case CrudOperatorEnum::OPERATOR_NEXT_DAY:
  477. $query = $query->whereBetweenTime($fieldName, Carbon::today()->toDateTimeString(), Carbon::today()->addDays((int)$search['value'])->toDateTimeString());
  478. break;
  479. case CrudOperatorEnum::OPERATOR_TO_DAY:
  480. $query = $query->whereTime($fieldName, Carbon::today()->toDateString());
  481. break;
  482. case CrudOperatorEnum::OPERATOR_WEEK:
  483. $query = $query->whereWeek($fieldName);
  484. break;
  485. case CrudOperatorEnum::OPERATOR_MONTH:
  486. $query = $query->whereMonth($fieldName);
  487. break;
  488. case CrudOperatorEnum::OPERATOR_QUARTER:
  489. $query = $query->whereBetweenTime($fieldName, Carbon::today()->startOfQuarter()->toDateTimeString(), Carbon::today()->endOfQuarter()->toDateTimeString());
  490. break;
  491. }
  492. });
  493. }
  494. });
  495. return $query;
  496. }
  497. }