From 1867083b14917291e4592b4714b01839ce82c8a5 Mon Sep 17 00:00:00 2001 From: "as2252258@163.com" Date: Sat, 24 Apr 2021 19:46:24 +0800 Subject: [PATCH] modify --- Annotation/Annotation.php | 37 +- Database/ActiveRecord.php | 716 ++++++++++++++--------------- Database/Base/BaseActiveRecord.php | 8 +- 3 files changed, 385 insertions(+), 376 deletions(-) diff --git a/Annotation/Annotation.php b/Annotation/Annotation.php index f11985a0..ec5aa8b9 100644 --- a/Annotation/Annotation.php +++ b/Annotation/Annotation.php @@ -31,7 +31,7 @@ class Annotation extends Component */ public function addSets(string $class, string $setName, string $method) { - $this->_model_sets[$class . '::' . $setName] = $method; + $this->_model_sets[$class][$setName] = $method; } /** @@ -41,7 +41,7 @@ class Annotation extends Component */ public function addGets(string $class, string $setName, string $method) { - $this->_model_gets[$class . '::' . $setName] = $method; + $this->_model_gets[$class][$setName] = $method; } @@ -52,7 +52,7 @@ class Annotation extends Component */ public function addRelate(string $class, string $setName, string $method) { - $this->_model_relate[$class . '::' . $setName] = $method; + $this->_model_relate[$class][$setName] = $method; } @@ -63,16 +63,25 @@ class Annotation extends Component */ public function getGetMethodName(string $class, string $setName): ?string { - if (isset($this->_model_gets[$class . '::' . $setName])) { - return $this->_model_gets[$class . '::' . $setName]; + $gets = $this->_model_gets[$class] ?? $this->_model_relate[$class] ?? null; + if ($gets == null) { + return null; } - if (isset($this->_model_relate[$class . '::' . $setName])) { - return $this->_model_relate[$class . '::' . $setName]; - } - return null; + return $gets[$setName] ?? null; } + /** + * @param string $class + * @return array + */ + public function getModelMethods(string $class): array + { + return $this->_model_gets[$class] ?? []; + } + + + /** * @param string $class * @param string $setName @@ -80,8 +89,14 @@ class Annotation extends Component */ public function getSetMethodName(string $class, string $setName): ?string { - if (isset($this->_model_sets[$class . '::' . $setName])) { - return $this->_model_relate[$class . '::' . $setName]; + if (!isset($this->_model_sets[$class])) { + return null; + } + + $lists = $this->_model_sets[$class]; + + if (isset($lists[$setName])) { + return $lists[$setName]; } return null; } diff --git a/Database/ActiveRecord.php b/Database/ActiveRecord.php index a6399525..d16398e2 100644 --- a/Database/ActiveRecord.php +++ b/Database/ActiveRecord.php @@ -32,415 +32,415 @@ defined('FIND_OR_CREATE_MESSAGE') or define('FIND_OR_CREATE_MESSAGE', 'Create a class ActiveRecord extends BaseActiveRecord { - const DECR = 'decr'; - const INCR = 'incr'; + const DECR = 'decr'; + const INCR = 'incr'; - /** - * @return array - */ - public function rules(): array - { - return []; - } + /** + * @return array + */ + public function rules(): array + { + return []; + } - /** - * @param string $column - * @param int $value - * @return ActiveRecord|false - * @throws Exception - */ - public function increment(string $column, int $value): bool|ActiveRecord - { - if (!$this->mathematics([$column => $value], '+')) { - return false; - } - $this->{$column} += $value; - return $this->refresh(); - } + /** + * @param string $column + * @param int $value + * @return ActiveRecord|false + * @throws Exception + */ + public function increment(string $column, int $value): bool|ActiveRecord + { + if (!$this->mathematics([$column => $value], '+')) { + return false; + } + $this->{$column} += $value; + return $this->refresh(); + } - /** - * @param string $column - * @param int $value - * @return ActiveRecord|false - * @throws Exception - */ - public function decrement(string $column, int $value): bool|ActiveRecord - { - if (!$this->mathematics([$column => $value], '-')) { - return false; - } - $this->{$column} -= $value; - return $this->refresh(); - } + /** + * @param string $column + * @param int $value + * @return ActiveRecord|false + * @throws Exception + */ + public function decrement(string $column, int $value): bool|ActiveRecord + { + if (!$this->mathematics([$column => $value], '-')) { + return false; + } + $this->{$column} -= $value; + return $this->refresh(); + } - /** - * @param array $columns - * @return ActiveRecord|false - * @throws Exception - */ - public function increments(array $columns): bool|static - { - if (!$this->mathematics($columns, '+')) { - return false; - } - foreach ($columns as $key => $attribute) { - $this->$key += $attribute; - } - return $this; - } + /** + * @param array $columns + * @return ActiveRecord|false + * @throws Exception + */ + public function increments(array $columns): bool|static + { + if (!$this->mathematics($columns, '+')) { + return false; + } + foreach ($columns as $key => $attribute) { + $this->$key += $attribute; + } + return $this; + } - /** - * @param array $columns - * @return ActiveRecord|false - * @throws Exception - */ - public function decrements(array $columns): bool|static - { - if (!$this->mathematics($columns, '-')) { - return false; - } - foreach ($columns as $key => $attribute) { - $this->$key -= $attribute; - } - return $this; - } + /** + * @param array $columns + * @return ActiveRecord|false + * @throws Exception + */ + public function decrements(array $columns): bool|static + { + if (!$this->mathematics($columns, '-')) { + return false; + } + foreach ($columns as $key => $attribute) { + $this->$key -= $attribute; + } + return $this; + } - /** - * @param array $condition - * @param array $attributes - * @return bool|ActiveRecord - * @throws ReflectionException - * @throws NotFindClassException - * @throws Exception - */ - public static function findOrCreate(array $condition, array $attributes = []): bool|static - { - $logger = Snowflake::app()->getLogger(); + /** + * @param array $condition + * @param array $attributes + * @return bool|ActiveRecord + * @throws ReflectionException + * @throws NotFindClassException + * @throws Exception + */ + public static function findOrCreate(array $condition, array $attributes = []): bool|static + { + $logger = Snowflake::app()->getLogger(); - /** @var static $select */ - $select = static::find()->where($condition)->first(); - if (!empty($select)) { - return $select; - } - if (empty($attributes)) { - return $logger->addError(FIND_OR_CREATE_MESSAGE, 'mysql'); - } - $select = self::getModelClass(); - $select->attributes = $attributes; - if (!$select->save()) { - return $logger->addError($select->getLastError(), 'mysql'); - } - return $select; - } + /** @var static $select */ + $select = static::find()->where($condition)->first(); + if (!empty($select)) { + return $select; + } + if (empty($attributes)) { + return $logger->addError(FIND_OR_CREATE_MESSAGE, 'mysql'); + } + $select = self::getModelClass(); + $select->attributes = $attributes; + if (!$select->save()) { + return $logger->addError($select->getLastError(), 'mysql'); + } + return $select; + } - /** - * @param array $condition - * @param array $attributes - * @return bool|static - * @throws Exception - */ - public static function createOrUpdate(array $condition, array $attributes = []): bool|static - { - $logger = Snowflake::app()->getLogger(); - if (empty($attributes)) { - return $logger->addError(FIND_OR_CREATE_MESSAGE, 'mysql'); - } - /** @var static $select */ - $select = static::find()->where($condition)->first(); - if (empty($select)) { - $select = self::getModelClass(); - } - $select->attributes = $attributes; - if (!$select->save()) { - return $logger->addError($select->getLastError(), 'mysql'); - } - return $select; - } + /** + * @param array $condition + * @param array $attributes + * @return bool|static + * @throws Exception + */ + public static function createOrUpdate(array $condition, array $attributes = []): bool|static + { + $logger = Snowflake::app()->getLogger(); + if (empty($attributes)) { + return $logger->addError(FIND_OR_CREATE_MESSAGE, 'mysql'); + } + /** @var static $select */ + $select = static::find()->where($condition)->first(); + if (empty($select)) { + $select = self::getModelClass(); + } + $select->attributes = $attributes; + if (!$select->save()) { + return $logger->addError($select->getLastError(), 'mysql'); + } + return $select; + } - /** - * @return static - * @throws Exception - */ - private static function getModelClass(): static - { - $className = get_called_class(); - /** @var Channel $channel */ - $channel = Snowflake::app()->get('channel'); - return $channel->pop($className, function () use ($className) { - return new $className(); - }); - } + /** + * @return static + * @throws Exception + */ + private static function getModelClass(): static + { + $className = get_called_class(); + /** @var Channel $channel */ + $channel = Snowflake::app()->get('channel'); + return $channel->pop($className, function () use ($className) { + return new $className(); + }); + } - /** - * @param $action - * @param $columns - * @param array $condition - * @return array|bool|int|string|null - * @throws Exception - */ - private function mathematics($columns, $action, $condition = []): int|bool|array|string|null - { - if (empty($condition)) { - $condition = [$this->getPrimary() => $this->getPrimaryValue()]; - } + /** + * @param $action + * @param $columns + * @param array $condition + * @return array|bool|int|string|null + * @throws Exception + */ + private function mathematics($columns, $action, $condition = []): int|bool|array|string|null + { + if (empty($condition)) { + $condition = [$this->getPrimary() => $this->getPrimaryValue()]; + } - $activeQuery = static::find()->where($condition); - $create = SqlBuilder::builder($activeQuery)->mathematics($columns, $action); - if (is_bool($create)) { - return false; - } - return static::getDb()->createCommand($create[0], $create[1])->exec(); - } + $activeQuery = static::find()->where($condition); + $create = SqlBuilder::builder($activeQuery)->mathematics($columns, $action); + if (is_bool($create)) { + return false; + } + return static::getDb()->createCommand($create[0], $create[1])->exec(); + } - /** - * @param array $fields - * @return ActiveRecord|bool - * @throws Exception - */ - public function update(array $fields): static|bool - { - return $this->save($fields); - } + /** + * @param array $fields + * @return ActiveRecord|bool + * @throws Exception + */ + public function update(array $fields): static|bool + { + return $this->save($fields); + } - /** - * @param array $data - * @return bool - * @throws Exception - */ - public static function inserts(array $data): bool - { - /** @var static $class */ - $class = Snowflake::createObject(['class' => static::class]); - if (empty($data)) { - return $class->addError('Insert data empty.', 'mysql'); - } - return $class::find()->batchInsert($data); - } + /** + * @param array $data + * @return bool + * @throws Exception + */ + public static function inserts(array $data): bool + { + /** @var static $class */ + $class = Snowflake::createObject(['class' => static::class]); + if (empty($data)) { + return $class->addError('Insert data empty.', 'mysql'); + } + return $class::find()->batchInsert($data); + } - /** - * @return bool - * @throws Exception - */ - public function delete(): bool - { - $conditions = $this->_oldAttributes; - if (empty($conditions)) { - return $this->addError("Delete condition do not empty.", 'mysql'); - } - $primary = $this->getPrimary(); + /** + * @return bool + * @throws Exception + */ + public function delete(): bool + { + $conditions = $this->_oldAttributes; + if (empty($conditions)) { + return $this->addError("Delete condition do not empty.", 'mysql'); + } + $primary = $this->getPrimary(); - if (!empty($primary)) { - $conditions = [$primary => $this->getAttribute($primary)]; - } - return static::deleteByCondition($conditions); - } + if (!empty($primary)) { + $conditions = [$primary => $this->getAttribute($primary)]; + } + return static::deleteByCondition($conditions); + } - /** - * @param $condition - * @param array $attributes - * - * @return bool - * @throws Exception - */ - public static function updateAll(mixed $condition, $attributes = []): bool - { - $condition = static::find()->where($condition); - return $condition->batchUpdate($attributes); - } + /** + * @param $condition + * @param array $attributes + * + * @return bool + * @throws Exception + */ + public static function updateAll(mixed $condition, $attributes = []): bool + { + $condition = static::find()->where($condition); + return $condition->batchUpdate($attributes); + } - /** - * @param $condition - * @param array $attributes - * - * @return array|Collection - * @throws Exception - */ - public static function findAll($condition, $attributes = []): array|Collection - { - $query = static::find()->where($condition); - if (!empty($attributes)) { - $query->bindParams($attributes); - } - return $query->all(); - } + /** + * @param $condition + * @param array $attributes + * + * @return array|Collection + * @throws Exception + */ + public static function findAll($condition, $attributes = []): array|Collection + { + $query = static::find()->where($condition); + if (!empty($attributes)) { + $query->bindParams($attributes); + } + return $query->all(); + } - /** - * @param $method - * @return mixed - * @throws Exception - */ - private function resolveObject($method): mixed - { - $resolve = $this->{$this->getRelate($method)}(); - if ($resolve instanceof HasBase) { - $resolve = $resolve->get(); - } - if ($resolve instanceof Collection) { - return $resolve->toArray(); - } else if ($resolve instanceof ActiveRecord) { - return $resolve->toArray(); - } else if (is_object($resolve)) { - return get_object_vars($resolve); - } else { - return $resolve; - } - } + /** + * @param $method + * @return mixed + * @throws Exception + */ + private function resolveObject($method): mixed + { + $resolve = $this->{$this->getRelate($method)}(); + if ($resolve instanceof HasBase) { + $resolve = $resolve->get(); + } + if ($resolve instanceof Collection) { + return $resolve->toArray(); + } else if ($resolve instanceof ActiveRecord) { + return $resolve->toArray(); + } else if (is_object($resolve)) { + return get_object_vars($resolve); + } else { + return $resolve; + } + } - /** - * @return array - * @throws Exception - */ - public function toArray(): array - { - $data = $this->_attributes; - foreach ($this->getAnnotation(self::ANNOTATION_GET) as $key => $item) { - if (!isset($data[$key])) continue; + /** + * @return array + * @throws Exception + */ + public function toArray(): array + { + $data = $this->_attributes; - $data[$key] = $this->runAnnotation($key, $data[$key] ?? null); - } - $data = array_merge($data, $this->runRelate()); - return $data; - } + $lists = Snowflake::getAnnotation()->getModelMethods(get_called_class()); + foreach ($lists as $key => $item) { + $data[$key] = $this->{$item}($data[$key] ?? null); + } + $data = array_merge($data, $this->runRelate()); + return $data; + } - /** - * @return array - * @throws Exception - */ - private function runRelate(): array - { - $relates = []; - if (empty($with = $this->getWith())) { - return $relates; - } - foreach ($with as $val) { - $relates[$val] = $this->resolveObject($val); - } - return $relates; - } + /** + * @return array + * @throws Exception + */ + private function runRelate(): array + { + $relates = []; + if (empty($with = $this->getWith())) { + return $relates; + } + foreach ($with as $val) { + $relates[$val] = $this->resolveObject($val); + } + return $relates; + } - /** - * @param string $modelName - * @param $foreignKey - * @param $localKey - * @return ActiveQuery - * @throws Exception - */ - public function hasOne(string $modelName, $foreignKey, $localKey): mixed - { - if (!$this->has($localKey)) { - throw new Exception("Need join table primary key."); - } + /** + * @param string $modelName + * @param $foreignKey + * @param $localKey + * @return ActiveQuery + * @throws Exception + */ + public function hasOne(string $modelName, $foreignKey, $localKey): mixed + { + if (!$this->has($localKey)) { + throw new Exception("Need join table primary key."); + } - $value = $this->getAttribute($localKey); + $value = $this->getAttribute($localKey); - $relation = $this->getRelation(); + $relation = $this->getRelation(); - return new HasOne($modelName, $foreignKey, $value, $relation); - } + return new HasOne($modelName, $foreignKey, $value, $relation); + } - /** - * @param $modelName - * @param $foreignKey - * @param $localKey - * @return ActiveQuery - * @throws Exception - */ - public function hasCount($modelName, $foreignKey, $localKey): mixed - { - if (!$this->has($localKey)) { - throw new Exception("Need join table primary key."); - } + /** + * @param $modelName + * @param $foreignKey + * @param $localKey + * @return ActiveQuery + * @throws Exception + */ + public function hasCount($modelName, $foreignKey, $localKey): mixed + { + if (!$this->has($localKey)) { + throw new Exception("Need join table primary key."); + } - $value = $this->getAttribute($localKey); + $value = $this->getAttribute($localKey); - $relation = $this->getRelation(); + $relation = $this->getRelation(); - return new HasCount($modelName, $foreignKey, $value, $relation); - } + return new HasCount($modelName, $foreignKey, $value, $relation); + } - /** - * @param $modelName - * @param $foreignKey - * @param $localKey - * @return ActiveQuery - * @throws Exception - */ - public function hasMany($modelName, $foreignKey, $localKey): mixed - { - if (!$this->has($localKey)) { - throw new Exception("Need join table primary key."); - } + /** + * @param $modelName + * @param $foreignKey + * @param $localKey + * @return ActiveQuery + * @throws Exception + */ + public function hasMany($modelName, $foreignKey, $localKey): mixed + { + if (!$this->has($localKey)) { + throw new Exception("Need join table primary key."); + } - $value = $this->getAttribute($localKey); + $value = $this->getAttribute($localKey); - $relation = $this->getRelation(); + $relation = $this->getRelation(); - return new HasMany($modelName, $foreignKey, $value, $relation); - } + return new HasMany($modelName, $foreignKey, $value, $relation); + } - /** - * @param $modelName - * @param $foreignKey - * @param $localKey - * @return ActiveQuery - * @throws Exception - */ - public function hasIn($modelName, $foreignKey, $localKey): mixed - { - if (!$this->has($localKey)) { - throw new Exception("Need join table primary key."); - } + /** + * @param $modelName + * @param $foreignKey + * @param $localKey + * @return ActiveQuery + * @throws Exception + */ + public function hasIn($modelName, $foreignKey, $localKey): mixed + { + if (!$this->has($localKey)) { + throw new Exception("Need join table primary key."); + } - $value = $this->getAttribute($localKey); + $value = $this->getAttribute($localKey); - $relation = $this->getRelation(); + $relation = $this->getRelation(); - return new HasMany($modelName, $foreignKey, $value, $relation); - } + return new HasMany($modelName, $foreignKey, $value, $relation); + } - /** - * @return bool - * @throws Exception - */ - public function afterDelete(): bool - { - if (!$this->hasPrimary()) { - return TRUE; - } - $value = $this->getPrimaryValue(); - if (empty($value)) { - return TRUE; - } - return TRUE; - } + /** + * @return bool + * @throws Exception + */ + public function afterDelete(): bool + { + if (!$this->hasPrimary()) { + return TRUE; + } + $value = $this->getPrimaryValue(); + if (empty($value)) { + return TRUE; + } + return TRUE; + } - /** - * @return bool - * @throws Exception - */ - public function beforeDelete(): bool - { - if (!$this->hasPrimary()) { - return TRUE; - } - $value = $this->getPrimaryValue(); - if (empty($value)) { - return TRUE; - } - return TRUE; - } + /** + * @return bool + * @throws Exception + */ + public function beforeDelete(): bool + { + if (!$this->hasPrimary()) { + return TRUE; + } + $value = $this->getPrimaryValue(); + if (empty($value)) { + return TRUE; + } + return TRUE; + } } diff --git a/Database/Base/BaseActiveRecord.php b/Database/Base/BaseActiveRecord.php index 01b30a79..d7e1c532 100644 --- a/Database/Base/BaseActiveRecord.php +++ b/Database/Base/BaseActiveRecord.php @@ -383,13 +383,7 @@ abstract class BaseActiveRecord extends Component implements IOrm, ArrayAccess */ public function getAttributes(): array { - $data = $this->_attributes; - foreach ($this->getAnnotation() as $key => $item) { - if (!isset($data[$key])) continue; - - $data[$key] = $this->runAnnotation($key, $data[$key] ?? null); - } - return $data; + return $this->toArray(); } /**