* @date 2019-12-12 16:49:14 */ declare(strict_types=1); namespace App\Model; use Hyperf\Contract\LengthAwarePaginatorInterface; use Hyperf\Database\ConnectionInterface; use Hyperf\Database\Model\Model; use Hyperf\Database\Model\SoftDeletes; use Hyperf\ModelCache\Cacheable; use Hyperf\ModelCache\CacheableInterface; use Hyperf\DbConnection\Model\Model as HyperfBaseModel; use Hyperf\Database\Model\Builder as HyperfModelBuilder; use Hyperf\Database\Model\Collection as HyperfModelCollection; use Hyperf\Utils\Collection; use Psr\EventDispatcher\EventDispatcherInterface; /** * Class BaseModel * * @method HyperfModelBuilder whereKey($id) * @method HyperfModelBuilder whereKeyNot($id) * @method HyperfModelBuilder where($column, $operator = null, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder whereIn($column, $values, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder whereNotIn($column, $values, $boolean = 'and') * @method HyperfModelBuilder orWhere($column, $operator = null, $value = null, $boolean = 'and') * @method bool exists() * @method HyperfModelBuilder latest($column = null) * @method HyperfModelBuilder oldest($column = null) * @method HyperfModelCollection hydrate(array $items) * @method HyperfModelCollection fromQuery($query, $bindings = []) * @method HyperfBaseModel find($id, $columns = ['*']) * @method HyperfModelCollection findMany($ids, $columns = ['*']) * @method HyperfBaseModel findOrFail($ids, $columns = ['*']) * @method HyperfBaseModel findOrNew($id, $columns = ['*']) * @method HyperfBaseModel firstOrNew(array $attributes, array $values = []) * @method HyperfBaseModel firstOrCreate(array $attributes, array $values = []) * @method HyperfBaseModel updateOrCreate(array $attributes, array $values = []) * @method HyperfBaseModel firstOrFail($columns = ['*']) * @method HyperfBaseModel firstOr($columns = ['*'], Closure $callback = null) * @method string value($column) * @method Collection get($columns = ['*']) * @method HyperfBaseModel getModels($columns = ['*']) * @method array eagerLoadRelations(array $models) * @method \Hyperf\Database\Model\Relations\Relation getRelation($name) * @method \Generator cursor() * @method bool chunkById($count, callable $callback, $column = null, $alias = null) * @method bool chunk($count, callable $callback) * @method \Hyperf\Utils\Collection pluck($column, $key = null) * @method LengthAwarePaginatorInterface paginate(int $perPage = null, array $columns = ['*'], string $pageName = 'page', ?int $page = null) * @method \Hyperf\Contract\PaginatorInterface simplePaginate($perPage = null, $columns = ['*'], $pageName = 'page', $page = null) * @method HyperfBaseModel create(array $attributes = []) * @method HyperfBaseModel forceCreate(array $attributes) * @method int update(array $values) * @method int increment($column, $amount = 1, array $extra = []) * @method int decrement($column, $amount = 1, array $extra = []) * @method delete() * @method forceDelete() * @method onDelete(Closure $callback) * @method scopes(array $scopes) * @method applyScopes() * @method HyperfBaseModel with($relations) * @method HyperfBaseModel without($relations) * @method HyperfBaseModel newModelInstance($attributes = []) * @method \Hyperf\Database\Query\Builder getQuery() * @method \Hyperf\Database\Query\Builder setQuery($query) * @method \Hyperf\Database\Query\Builder toBase() * @method \Hyperf\Database\Query\Builder orderBy($column, $direction = 'asc') * @method \Hyperf\Database\Query\Builder orderByDesc($column, $direction = 'asc') * @method \Hyperf\Database\Query\Builder inRandomOrder($seed = '') * @method \Hyperf\Database\Query\Builder orderByRaw($sql, $bindings = []) * @method \Hyperf\Database\Query\Builder skip($value) * @method \Hyperf\Database\Query\Builder offset($value) * @method \Hyperf\Database\Query\Builder take($value) * @method \Hyperf\Database\Query\Builder limit($value) * @method \Hyperf\Database\Query\Builder forPage($page, $perPage = 15) * @method \Hyperf\Database\Query\Builder forPageAfterId($perPage = 15, $lastId = 0, $column = 'id') * @method \Hyperf\Database\Query\Builder union($query, $all = false) * @method \Hyperf\Database\Query\Builder unionAll($query) * @method \Hyperf\Database\Query\Builder lock($value = true) * @method \Hyperf\Database\Query\Builder lockForUpdate() * @method \Hyperf\Database\Query\Builder sharedLock() * @method string toSql() * @method \Hyperf\Database\Query\Builder select($columns = ['*']) * @method \Hyperf\Database\Query\Builder selectSub($query, $as) * @method \Hyperf\Database\Query\Builder selectRaw($expression, array $bindings = []) * @method \Hyperf\Database\Query\Builder fromSub($query, $as) * @method \Hyperf\Database\Query\Builder fromRaw($expression, $bindings = []) * @method \Hyperf\Database\Query\Builder addSelect($column) * @method \Hyperf\Database\Query\Builder from($table) * @method \Hyperf\Database\Query\Builder join($table, $first, $operator = null, $second = null, $type = 'inner', $where = false) * @method \Hyperf\Database\Query\Builder joinWhere($table, $first, $operator, $second, $type = 'inner') * @method \Hyperf\Database\Query\Builder joinSub($query, $as, $first, $operator = null, $second = null, $type = 'inner', $where = false) * @method \Hyperf\Database\Query\Builder leftJoin($table, $first, $operator = null, $second = null) * @method \Hyperf\Database\Query\Builder leftJoinWhere($table, $first, $operator, $second) * @method \Hyperf\Database\Query\Builder leftJoinSub($query, $as, $first, $operator = null, $second = null) * @method \Hyperf\Database\Query\Builder distinct() * @method \Hyperf\Database\Query\Builder rightJoin($table, $first, $operator = null, $second = null) * @method \Hyperf\Database\Query\Builder rightJoinWhere($table, $first, $operator, $second) * @method \Hyperf\Database\Query\Builder rightJoinSub($query, $as, $first, $operator = null, $second = null) * @method \Hyperf\Database\Query\Builder crossJoin($table, $first = null, $operator = null, $second = null) * @method void mergeWheres($wheres, $bindings) * @method array prepareValueAndOperator($value, $operator, $useDefault = false) * @method \Hyperf\Database\Query\Builder whereColumn($first, $operator = null, $second = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereColumn($first, $operator = null, $second = null) * @method \Hyperf\Database\Query\Builder whereRaw($sql, $bindings = [], $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereRaw($sql, $bindings = []) * @method \Hyperf\Database\Query\Builder orWhereIn($column, $values) * @method \Hyperf\Database\Query\Builder orWhereNotIn($column, $values) * @method \Hyperf\Database\Query\Builder whereIntegerInRaw($column, $values, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder whereIntegerNotInRaw($column, $values, $boolean = 'and') * @method \Hyperf\Database\Query\Builder whereNull($column, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder orWhereNull($column) * @method \Hyperf\Database\Query\Builder whereNotNull($column, $boolean = 'and') * @method \Hyperf\Database\Query\Builder whereBetween($column, array $values, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder orWhereBetween($column, array $values) * @method \Hyperf\Database\Query\Builder whereNotBetween($column, array $values, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereNotBetween($column, array $values) * @method \Hyperf\Database\Query\Builder orWhereNotNull($column) * @method \Hyperf\Database\Query\Builder whereDate($column, $operator, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereDate($column, $operator, $value = null) * @method \Hyperf\Database\Query\Builder whereTime($column, $operator, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereTime($column, $operator, $value = null) * @method \Hyperf\Database\Query\Builder whereDay($column, $operator, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereDay($column, $operator, $value = null) * @method \Hyperf\Database\Query\Builder whereMonth($column, $operator, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereMonth($column, $operator, $value = null) * @method \Hyperf\Database\Query\Builder whereYear($column, $operator, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereYear($column, $operator, $value = null) * @method \Hyperf\Database\Query\Builder whereNested(\Closure $callback, $boolean = 'and') * @method \Hyperf\Database\Query\Builder forNestedWhere() * @method \Hyperf\Database\Query\Builder addNestedWhereQuery($query, $boolean = 'and') * @method \Hyperf\Database\Query\Builder whereExists(\Closure $callback, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder orWhereExists(\Closure $callback, $not = false) * @method \Hyperf\Database\Query\Builder whereNotExists(\Closure $callback, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereNotExists(\Closure $callback) * @method \Hyperf\Database\Query\Builder addWhereExistsQuery(self $query, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder whereRowValues($columns, $operator, $values, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereRowValues($columns, $operator, $values) * @method \Hyperf\Database\Query\Builder whereJsonContains($column, $value, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder orWhereJsonContains($column, $value) * @method \Hyperf\Database\Query\Builder whereJsonDoesntContain($column, $value, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereJsonDoesntContain($column, $value) * @method \Hyperf\Database\Query\Builder whereJsonLength($column, $operator, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orWhereJsonLength($column, $operator, $value = null) * @method \Hyperf\Database\Query\Builder dynamicWhere($method, $parameters) * @method \Hyperf\Database\Query\Builder groupBy(...$groups) * @method \Hyperf\Database\Query\Builder having($column, $operator = null, $value = null, $boolean = 'and') * @method \Hyperf\Database\Query\Builder orHaving($column, $operator = null, $value = null) * @method \Hyperf\Database\Query\Builder havingBetween($column, array $values, $boolean = 'and', $not = false) * @method \Hyperf\Database\Query\Builder havingRaw($sql, array $bindings = [], $boolean = 'and') * @method \Hyperf\Database\Query\Builder orHavingRaw($sql, array $bindings = []) * @method int getCountForPagination($columns = ['*']) * @method string implode($column, $glue = '') * @method bool doesntExist() * @method int count($columns = '*') * @method string min($column) * @method string max($column) * @method string sum($column) * @method string avg($column) * @method string average($column) * @method \Hyperf\Database\Model\Collection forceFill(array $attributes) * @method \Hyperf\Database\Model\Model all($columns = ['*']) * @method string qualifyColumn($column) * @method static newInstance($attributes = [], $exists = false) * @method static newFromBuilder($attributes = [], $connection = null) * @method \Hyperf\Database\Model\Builder on($connection = null) * @method \Hyperf\Database\Query\Builder onWriteConnection() * @method \Hyperf\Database\Model\Model load($relations) * @method \Hyperf\Database\Model\Model loadMissing($relations) * @method \Hyperf\Database\Model\Model loadCount($relations) * @method bool push() * @method bool save(array $options = []) * @method bool saveOrFail(array $options = []) * @method int destroy($ids) * @method \Hyperf\Database\Model\Builder newQuery() * @method \Hyperf\Database\Model\Builder newModelQuery() * @method \Hyperf\Database\Model\Builder newQueryWithoutRelationships() * @method \Hyperf\Database\Model\Builder registerGlobalScopes($builder) * @method \Hyperf\Database\Model\Builder newQueryWithoutScopes() * @method \Hyperf\Database\Model\Builder newQueryWithoutScope($scope) * @method \Hyperf\Database\Model\Builder newQueryForRestoration($ids) * @method \Hyperf\Database\Model\Builder newModelBuilder($query) * @method \Hyperf\Database\Model\Collection newCollection(array $models = []) * @method \Hyperf\Database\Model\Relations\Pivot newPivot(self $parent, array $attributes, $table, $exists, $using = null) * @method array toArray() * @method string toJson($options = 0) * @method array jsonSerialize() * @method static fresh($with = []) * @method \Hyperf\Database\Model\Model refresh() * @method static replicate(array $except = null) * @method bool is($model) * @method bool isNot($model) * @method ConnectionInterface getConnection() * @method EventDispatcherInterface getEventDispatcher() * @method string getConnectionName() * @method \Hyperf\Database\Model\Model setConnection($name) * @method string getTable() * @method \Hyperf\Database\Model\Model setTable($table) * @method string getKeyName() * @method \Hyperf\Database\Model\Model setKeyName($key) * @method string getQualifiedKeyName() * @method string getKeyType() * @method bool getIncrementing() * @method \Hyperf\Database\Model\Model setIncrementing($value) * @method mixed getKey() * @method mixed getRouteKey() * @method mixed getRouteKeyName() * @method array getEagerLoads() * @method \Hyperf\Database\Model\Model resolveRouteBinding($value) * @method string getForeignKey() * @method int getPerPage() * @method \Hyperf\Database\Model\Model setPerPage($perPage) * @method bool offsetExists($offset) * @method mixed offsetGet($offset) * @method mixed offsetSet($offset, $value) * @method mixed offsetUnset($offset) * @method mixed compress() * @method \Hyperf\Database\Model\Model first($columns = ['*']) * @method bool each(callable $callback, $count = 1000) * @method \Hyperf\Database\Model\Model when($value, $callback, $default = null) * @method \Hyperf\Database\Model\Model tap($callback) * @method \Hyperf\Database\Model\Model unless($value, $callback, $default = null) * @method HyperfModelBuilder setEagerLoads(array $eagerLoad) * @method \Hyperf\Database\Model\Model getModel() * @method Model setModel(Model $model) * @method \Closure getMacro($name) * @package App\Model\BaseModel */ abstract class BaseModel extends HyperfBaseModel { // 使用自动缓存. //implements CacheableInterface // use Cacheable; // 使用软删. // use SoftDeletes; protected $guarded = ['id']; protected $connection = 'default'; /** * 自定义主键名. * * @var string */ protected $primaryKey = 'id'; /** * 主键类型. * * @var string */ protected $keyType = 'integer'; /** * 自动维护时间戳created_at和updated_at. * * @var bool */ public $timestamps = true; /** * 是否默认主键自增. * * @var bool */ public $incrementing = true; /** * 每页尺码. * * @var int */ protected $perPage = 20; /** * 获取数据库版本. * * @return mixed */ public function getDbVersion() { return $this->getConnection()->getPdo()->getAttribute(\PDO::ATTR_SERVER_VERSION); } /** * 获取表前缀. * * @return mixed */ public function getTablePrefix() : string { return $this->getConnection()->getTablePrefix(); } /** * 生成一个ID * * @param string $idName 查询唯一ID字段名. * @param integer $length 长度. * * @return string */ public function generateId(string $idName, $length = 16) { if ($length <= 3) { $length = 16; } $uuid = strtoupper(rand_letter(1) . (random($length - 1))); if ($this->where($idName, $uuid)->exists()) { // 存在则继续生成,直到新的出现. return self::generateId($idName, $length); } return $uuid; } }