BaseModel.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. <?php
  2. /**
  3. * 描述.
  4. *
  5. * @author jim <jim458734573@gmail.com>
  6. * @date 2019-12-12 16:49:14
  7. */
  8. declare(strict_types=1);
  9. namespace App\Model;
  10. use Hyperf\Contract\LengthAwarePaginatorInterface;
  11. use Hyperf\Database\ConnectionInterface;
  12. use Hyperf\Database\Model\Model;
  13. use Hyperf\Database\Model\SoftDeletes;
  14. use Hyperf\ModelCache\Cacheable;
  15. use Hyperf\ModelCache\CacheableInterface;
  16. use Hyperf\DbConnection\Model\Model as HyperfBaseModel;
  17. use Hyperf\Database\Model\Builder as HyperfModelBuilder;
  18. use Hyperf\Database\Model\Collection as HyperfModelCollection;
  19. use Hyperf\Utils\Collection;
  20. use Psr\EventDispatcher\EventDispatcherInterface;
  21. /**
  22. * Class BaseModel
  23. *
  24. * @method HyperfModelBuilder whereKey($id)
  25. * @method HyperfModelBuilder whereKeyNot($id)
  26. * @method HyperfModelBuilder where($column, $operator = null, $value = null, $boolean = 'and')
  27. * @method \Hyperf\Database\Query\Builder whereIn($column, $values, $boolean = 'and', $not = false)
  28. * @method \Hyperf\Database\Query\Builder whereNotIn($column, $values, $boolean = 'and')
  29. * @method HyperfModelBuilder orWhere($column, $operator = null, $value = null, $boolean = 'and')
  30. * @method bool exists()
  31. * @method HyperfModelBuilder latest($column = null)
  32. * @method HyperfModelBuilder oldest($column = null)
  33. * @method HyperfModelCollection hydrate(array $items)
  34. * @method HyperfModelCollection fromQuery($query, $bindings = [])
  35. * @method HyperfBaseModel find($id, $columns = ['*'])
  36. * @method HyperfModelCollection findMany($ids, $columns = ['*'])
  37. * @method HyperfBaseModel findOrFail($ids, $columns = ['*'])
  38. * @method HyperfBaseModel findOrNew($id, $columns = ['*'])
  39. * @method HyperfBaseModel firstOrNew(array $attributes, array $values = [])
  40. * @method HyperfBaseModel firstOrCreate(array $attributes, array $values = [])
  41. * @method HyperfBaseModel updateOrCreate(array $attributes, array $values = [])
  42. * @method HyperfBaseModel firstOrFail($columns = ['*'])
  43. * @method HyperfBaseModel firstOr($columns = ['*'], Closure $callback = null)
  44. * @method string value($column)
  45. * @method Collection get($columns = ['*'])
  46. * @method HyperfBaseModel getModels($columns = ['*'])
  47. * @method array eagerLoadRelations(array $models)
  48. * @method \Hyperf\Database\Model\Relations\Relation getRelation($name)
  49. * @method \Generator cursor()
  50. * @method bool chunkById($count, callable $callback, $column = null, $alias = null)
  51. * @method bool chunk($count, callable $callback)
  52. * @method \Hyperf\Utils\Collection pluck($column, $key = null)
  53. * @method LengthAwarePaginatorInterface paginate(int $perPage = null, array $columns = ['*'], string $pageName = 'page', ?int $page = null)
  54. * @method \Hyperf\Contract\PaginatorInterface simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null)
  55. * @method HyperfBaseModel create(array $attributes = [])
  56. * @method HyperfBaseModel forceCreate(array $attributes)
  57. * @method int update(array $values)
  58. * @method int increment($column, $amount = 1, array $extra = [])
  59. * @method int decrement($column, $amount = 1, array $extra = [])
  60. * @method delete()
  61. * @method forceDelete()
  62. * @method onDelete(Closure $callback)
  63. * @method scopes(array $scopes)
  64. * @method applyScopes()
  65. * @method HyperfBaseModel with($relations)
  66. * @method HyperfBaseModel without($relations)
  67. * @method HyperfBaseModel newModelInstance($attributes = [])
  68. * @method \Hyperf\Database\Query\Builder getQuery()
  69. * @method \Hyperf\Database\Query\Builder setQuery($query)
  70. * @method \Hyperf\Database\Query\Builder toBase()
  71. * @method \Hyperf\Database\Query\Builder orderBy($column, $direction = 'asc')
  72. * @method \Hyperf\Database\Query\Builder orderByDesc($column, $direction = 'asc')
  73. * @method \Hyperf\Database\Query\Builder inRandomOrder($seed = '')
  74. * @method \Hyperf\Database\Query\Builder orderByRaw($sql, $bindings = [])
  75. * @method \Hyperf\Database\Query\Builder skip($value)
  76. * @method \Hyperf\Database\Query\Builder offset($value)
  77. * @method \Hyperf\Database\Query\Builder take($value)
  78. * @method \Hyperf\Database\Query\Builder limit($value)
  79. * @method \Hyperf\Database\Query\Builder forPage($page, $perPage = 15)
  80. * @method \Hyperf\Database\Query\Builder forPageAfterId($perPage = 15, $lastId = 0, $column = 'id')
  81. * @method \Hyperf\Database\Query\Builder union($query, $all = false)
  82. * @method \Hyperf\Database\Query\Builder unionAll($query)
  83. * @method \Hyperf\Database\Query\Builder lock($value = true)
  84. * @method \Hyperf\Database\Query\Builder lockForUpdate()
  85. * @method \Hyperf\Database\Query\Builder sharedLock()
  86. * @method string toSql()
  87. * @method \Hyperf\Database\Query\Builder select($columns = ['*'])
  88. * @method \Hyperf\Database\Query\Builder selectSub($query, $as)
  89. * @method \Hyperf\Database\Query\Builder selectRaw($expression, array $bindings = [])
  90. * @method \Hyperf\Database\Query\Builder fromSub($query, $as)
  91. * @method \Hyperf\Database\Query\Builder fromRaw($expression, $bindings = [])
  92. * @method \Hyperf\Database\Query\Builder addSelect($column)
  93. * @method \Hyperf\Database\Query\Builder from($table)
  94. * @method \Hyperf\Database\Query\Builder join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false)
  95. * @method \Hyperf\Database\Query\Builder joinWhere($table, $first, $operator, $second, $type = 'inner')
  96. * @method \Hyperf\Database\Query\Builder joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false)
  97. * @method \Hyperf\Database\Query\Builder leftJoin($table, $first, $operator = null, $second = null)
  98. * @method \Hyperf\Database\Query\Builder leftJoinWhere($table, $first, $operator, $second)
  99. * @method \Hyperf\Database\Query\Builder leftJoinSub($query, $as, $first, $operator = null, $second = null)
  100. * @method \Hyperf\Database\Query\Builder distinct()
  101. * @method \Hyperf\Database\Query\Builder rightJoin($table, $first, $operator = null, $second = null)
  102. * @method \Hyperf\Database\Query\Builder rightJoinWhere($table, $first, $operator, $second)
  103. * @method \Hyperf\Database\Query\Builder rightJoinSub($query, $as, $first, $operator = null, $second = null)
  104. * @method \Hyperf\Database\Query\Builder crossJoin($table, $first = null, $operator = null, $second = null)
  105. * @method void mergeWheres($wheres, $bindings)
  106. * @method array prepareValueAndOperator($value, $operator, $useDefault = false)
  107. * @method \Hyperf\Database\Query\Builder whereColumn($first, $operator = null, $second = null, $boolean = 'and')
  108. * @method \Hyperf\Database\Query\Builder orWhereColumn($first, $operator = null, $second = null)
  109. * @method \Hyperf\Database\Query\Builder whereRaw($sql, $bindings = [], $boolean = 'and')
  110. * @method \Hyperf\Database\Query\Builder orWhereRaw($sql, $bindings = [])
  111. * @method \Hyperf\Database\Query\Builder orWhereIn($column, $values)
  112. * @method \Hyperf\Database\Query\Builder orWhereNotIn($column, $values)
  113. * @method \Hyperf\Database\Query\Builder whereIntegerInRaw($column, $values, $boolean = 'and', $not = false)
  114. * @method \Hyperf\Database\Query\Builder whereIntegerNotInRaw($column, $values, $boolean = 'and')
  115. * @method \Hyperf\Database\Query\Builder whereNull($column, $boolean = 'and', $not = false)
  116. * @method \Hyperf\Database\Query\Builder orWhereNull($column)
  117. * @method \Hyperf\Database\Query\Builder whereNotNull($column, $boolean = 'and')
  118. * @method \Hyperf\Database\Query\Builder whereBetween($column, array $values, $boolean = 'and', $not = false)
  119. * @method \Hyperf\Database\Query\Builder orWhereBetween($column, array $values)
  120. * @method \Hyperf\Database\Query\Builder whereNotBetween($column, array $values, $boolean = 'and')
  121. * @method \Hyperf\Database\Query\Builder orWhereNotBetween($column, array $values)
  122. * @method \Hyperf\Database\Query\Builder orWhereNotNull($column)
  123. * @method \Hyperf\Database\Query\Builder whereDate($column, $operator, $value = null, $boolean = 'and')
  124. * @method \Hyperf\Database\Query\Builder orWhereDate($column, $operator, $value = null)
  125. * @method \Hyperf\Database\Query\Builder whereTime($column, $operator, $value = null, $boolean = 'and')
  126. * @method \Hyperf\Database\Query\Builder orWhereTime($column, $operator, $value = null)
  127. * @method \Hyperf\Database\Query\Builder whereDay($column, $operator, $value = null, $boolean = 'and')
  128. * @method \Hyperf\Database\Query\Builder orWhereDay($column, $operator, $value = null)
  129. * @method \Hyperf\Database\Query\Builder whereMonth($column, $operator, $value = null, $boolean = 'and')
  130. * @method \Hyperf\Database\Query\Builder orWhereMonth($column, $operator, $value = null)
  131. * @method \Hyperf\Database\Query\Builder whereYear($column, $operator, $value = null, $boolean = 'and')
  132. * @method \Hyperf\Database\Query\Builder orWhereYear($column, $operator, $value = null)
  133. * @method \Hyperf\Database\Query\Builder whereNested(\Closure $callback, $boolean = 'and')
  134. * @method \Hyperf\Database\Query\Builder forNestedWhere()
  135. * @method \Hyperf\Database\Query\Builder addNestedWhereQuery($query, $boolean = 'and')
  136. * @method \Hyperf\Database\Query\Builder whereExists(\Closure $callback, $boolean = 'and', $not = false)
  137. * @method \Hyperf\Database\Query\Builder orWhereExists(\Closure $callback, $not = false)
  138. * @method \Hyperf\Database\Query\Builder whereNotExists(\Closure $callback, $boolean = 'and')
  139. * @method \Hyperf\Database\Query\Builder orWhereNotExists(\Closure $callback)
  140. * @method \Hyperf\Database\Query\Builder addWhereExistsQuery(self $query, $boolean = 'and', $not = false)
  141. * @method \Hyperf\Database\Query\Builder whereRowValues($columns, $operator, $values, $boolean = 'and')
  142. * @method \Hyperf\Database\Query\Builder orWhereRowValues($columns, $operator, $values)
  143. * @method \Hyperf\Database\Query\Builder whereJsonContains($column, $value, $boolean = 'and', $not = false)
  144. * @method \Hyperf\Database\Query\Builder orWhereJsonContains($column, $value)
  145. * @method \Hyperf\Database\Query\Builder whereJsonDoesntContain($column, $value, $boolean = 'and')
  146. * @method \Hyperf\Database\Query\Builder orWhereJsonDoesntContain($column, $value)
  147. * @method \Hyperf\Database\Query\Builder whereJsonLength($column, $operator, $value = null, $boolean = 'and')
  148. * @method \Hyperf\Database\Query\Builder orWhereJsonLength($column, $operator, $value = null)
  149. * @method \Hyperf\Database\Query\Builder dynamicWhere($method, $parameters)
  150. * @method \Hyperf\Database\Query\Builder groupBy(...$groups)
  151. * @method \Hyperf\Database\Query\Builder having($column, $operator = null, $value = null, $boolean = 'and')
  152. * @method \Hyperf\Database\Query\Builder orHaving($column, $operator = null, $value = null)
  153. * @method \Hyperf\Database\Query\Builder havingBetween($column, array $values, $boolean = 'and', $not = false)
  154. * @method \Hyperf\Database\Query\Builder havingRaw($sql, array $bindings = [], $boolean = 'and')
  155. * @method \Hyperf\Database\Query\Builder orHavingRaw($sql, array $bindings = [])
  156. * @method int getCountForPagination($columns = ['*'])
  157. * @method string implode($column, $glue = '')
  158. * @method bool doesntExist()
  159. * @method int count($columns = '*')
  160. * @method string min($column)
  161. * @method string max($column)
  162. * @method string sum($column)
  163. * @method string avg($column)
  164. * @method string average($column)
  165. * @method \Hyperf\Database\Model\Collection forceFill(array $attributes)
  166. * @method \Hyperf\Database\Model\Model all($columns = ['*'])
  167. * @method string qualifyColumn($column)
  168. * @method static newInstance($attributes = [], $exists = false)
  169. * @method static newFromBuilder($attributes = [], $connection = null)
  170. * @method \Hyperf\Database\Model\Builder on($connection = null)
  171. * @method \Hyperf\Database\Query\Builder onWriteConnection()
  172. * @method \Hyperf\Database\Model\Model load($relations)
  173. * @method \Hyperf\Database\Model\Model loadMissing($relations)
  174. * @method \Hyperf\Database\Model\Model loadCount($relations)
  175. * @method bool push()
  176. * @method bool save(array $options = [])
  177. * @method bool saveOrFail(array $options = [])
  178. * @method int destroy($ids)
  179. * @method \Hyperf\Database\Model\Builder newQuery()
  180. * @method \Hyperf\Database\Model\Builder newModelQuery()
  181. * @method \Hyperf\Database\Model\Builder newQueryWithoutRelationships()
  182. * @method \Hyperf\Database\Model\Builder registerGlobalScopes($builder)
  183. * @method \Hyperf\Database\Model\Builder newQueryWithoutScopes()
  184. * @method \Hyperf\Database\Model\Builder newQueryWithoutScope($scope)
  185. * @method \Hyperf\Database\Model\Builder newQueryForRestoration($ids)
  186. * @method \Hyperf\Database\Model\Builder newModelBuilder($query)
  187. * @method \Hyperf\Database\Model\Collection newCollection(array $models = [])
  188. * @method \Hyperf\Database\Model\Relations\Pivot newPivot(self $parent, array $attributes, $table, $exists, $using = null)
  189. * @method array toArray()
  190. * @method string toJson($options = 0)
  191. * @method array jsonSerialize()
  192. * @method static fresh($with = [])
  193. * @method \Hyperf\Database\Model\Model refresh()
  194. * @method static replicate(array $except = null)
  195. * @method bool is($model)
  196. * @method bool isNot($model)
  197. * @method ConnectionInterface getConnection()
  198. * @method EventDispatcherInterface getEventDispatcher()
  199. * @method string getConnectionName()
  200. * @method \Hyperf\Database\Model\Model setConnection($name)
  201. * @method string getTable()
  202. * @method \Hyperf\Database\Model\Model setTable($table)
  203. * @method string getKeyName()
  204. * @method \Hyperf\Database\Model\Model setKeyName($key)
  205. * @method string getQualifiedKeyName()
  206. * @method string getKeyType()
  207. * @method bool getIncrementing()
  208. * @method \Hyperf\Database\Model\Model setIncrementing($value)
  209. * @method mixed getKey()
  210. * @method mixed getRouteKey()
  211. * @method mixed getRouteKeyName()
  212. * @method array getEagerLoads()
  213. * @method \Hyperf\Database\Model\Model resolveRouteBinding($value)
  214. * @method string getForeignKey()
  215. * @method int getPerPage()
  216. * @method \Hyperf\Database\Model\Model setPerPage($perPage)
  217. * @method bool offsetExists($offset)
  218. * @method mixed offsetGet($offset)
  219. * @method mixed offsetSet($offset, $value)
  220. * @method mixed offsetUnset($offset)
  221. * @method mixed compress()
  222. * @method \Hyperf\Database\Model\Model first($columns = ['*'])
  223. * @method bool each(callable $callback, $count = 1000)
  224. * @method \Hyperf\Database\Model\Model when($value, $callback, $default = null)
  225. * @method \Hyperf\Database\Model\Model tap($callback)
  226. * @method \Hyperf\Database\Model\Model unless($value, $callback, $default = null)
  227. * @method HyperfModelBuilder setEagerLoads(array $eagerLoad)
  228. * @method \Hyperf\Database\Model\Model getModel()
  229. * @method Model setModel(Model $model)
  230. * @method \Closure getMacro($name)
  231. * @package App\Model\BaseModel
  232. */
  233. abstract class BaseModel extends HyperfBaseModel
  234. {
  235. // 使用自动缓存.
  236. //implements CacheableInterface
  237. // use Cacheable;
  238. // 使用软删.
  239. // use SoftDeletes;
  240. protected $guarded = ['id'];
  241. protected $connection = 'default';
  242. /**
  243. * 自定义主键名.
  244. *
  245. * @var string
  246. */
  247. protected $primaryKey = 'id';
  248. /**
  249. * 主键类型.
  250. *
  251. * @var string
  252. */
  253. protected $keyType = 'integer';
  254. /**
  255. * 自动维护时间戳created_at和updated_at.
  256. *
  257. * @var bool
  258. */
  259. public $timestamps = true;
  260. /**
  261. * 是否默认主键自增.
  262. *
  263. * @var bool
  264. */
  265. public $incrementing = true;
  266. /**
  267. * 每页尺码.
  268. *
  269. * @var int
  270. */
  271. protected $perPage = 20;
  272. /**
  273. * 获取数据库版本.
  274. *
  275. * @return mixed
  276. */
  277. public function getDbVersion()
  278. {
  279. return $this->getConnection()->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION);
  280. }
  281. /**
  282. * 获取表前缀.
  283. *
  284. * @return mixed
  285. */
  286. public function getTablePrefix() : string
  287. {
  288. return $this->getConnection()->getTablePrefix();
  289. }
  290. /**
  291. * 生成一个ID
  292. *
  293. * @param string $idName 查询唯一ID字段名.
  294. * @param integer $length 长度.
  295. *
  296. * @return string
  297. */
  298. public function generateId(string $idName, $length = 16)
  299. {
  300. if ($length <= 3) {
  301. $length = 16;
  302. }
  303. $uuid = strtoupper(rand_letter(1) . (random($length - 1)));
  304. if ($this->where($idName, $uuid)->exists()) {
  305. // 存在则继续生成,直到新的出现.
  306. return self::generateId($idName, $length);
  307. }
  308. return $uuid;
  309. }
  310. }