nilportugues / sql-repository
SQL仓库实现
Requires
- php: >=7.0
- doctrine/dbal: ^2.5
- nilportugues/assert: ^1.0
- nilportugues/repository: ^3.1
Requires (Dev)
- fabpot/php-cs-fixer: 1.9.*
- phpunit/phpunit: 4.8.*
Suggests
- nilportugues/repository-cache: Cache database queries to improve performance.
This package is not auto-updated.
Last update: 2024-09-14 19:04:08 UTC
README
SQL仓库库旨在减少编写仓库所花费的时间。
创建此库的动机是在多个项目中重复编写SQL或使用查询构建器进行相同操作时的无聊。
SQL仓库允许您轻松地获取、分页和操作数据,而无需添加开销并遵循良好实践。
目录
功能
- 从开始就采用仓库模式。
- 使用Doctrine的DBAL提供多个SQL驱动程序。
- 所有操作从一开始就可用
- 使用PHP对象搜索仓库
- 无需编写基本操作的SQL。
- 可以使用过滤对象进行过滤。
- 可以使用字段对象获取特定字段。
- 使用页面和分页对象解决分页问题。
- 可以使用DBAL编写自定义操作。
- 想要更改持久层?提供的仓库替代方案是
- InMemoryRepository:用于测试目的
- FileRepository:无DB访问的站点或用于测试目的。
- MongoDBRepository:因为您的模式不断变化
- 以PHP编写的映射。
- 支持自定义数据类型(即值对象)。
- 使用点符号轻松映射深层数据结构。
- 填充是可选的。
- 当需要时使用填充。使用
SqlRepositoryHydrator特质启用它。
- 当需要时使用填充。使用
- 支持自定义ID和自增ID。
- 想要使用UUID或自定义ID策略?没问题!
- 需要缓存层?轻松添加!
- 需要从Composer中获取Repository Cache包以添加对所有操作的持续缓存。
安装
使用Composer安装包
$ composer require nilportugues/sql-repository
用法
显示代码
查看/example目录。提供了自定义ID和自增ID的示例。
说明
- 您需要一个实现提供
Mapping接口的类 - 您需要一个实现提供
Identity接口的类。添加2个方法,id()和__toString。 - 您需要一个从提供的
SqlRepository类扩展的类。将您的PDO连接和映射类注入到SqlRepository
您可以开始了。
--
映射
映射必须实现Mapping接口。
映射类用于从实体读取数据并将其保存到所选存储中。这是通过映射实体字段并指定哪些字段以及如何存储在数据存储中完成的。
对于复杂对象,例如一个包含值对象的实体,仍然可以在实体上进行单次映射,并通过访问值对象的属性来获取其存储。
映射还用于在使用加湿器特质的情况下将数据重新注入到实体中。
实体类
请记住,实体必须实现Identity接口才能与SqlRepository一起工作。这个实体可以是您的任何类。
use NilPortugues\Foundation\Domain\Model\Repository\Contracts\Identity; class User implements Identity { protected $userId; protected $username; protected $alias; protected $email; protected $registeredOn; /** * User constructor. * * @param $userId * @param $username * @param $alias * @param $email * @param \DateTime $registeredOn */ public function __construct($userId, $username, $alias, $email, \DateTime $registeredOn) { $this->userId = $userId; $this->username = $username; $this->alias = $alias; $this->email = $email; $this->registeredOn = $registeredOn; } // ... your getters/setters public function id() { return $this->userId; } public function __toString() { return (string) $this->id(); } }
映射类
Mapping接口的所有方法都是强制性的。
use NilPortugues\Foundation\Domain\Model\Repository\Contracts\Mapping; class UserMapping implements Mapping { /** * Name of the identity field in storage. */ public function identity() : string { return 'user_id'; } /** * Returns the table name. */ public function name() : string { return 'users'; } /** * Keys are object properties without property defined in identity(). * Values its SQL column equivalents. */ public function map() : array { return [ // Flat objects or objects with one value don't // require dot notation. 'userId' => 'user_id', 'username' => 'username', 'alias' => 'public_username', 'email' => 'email', // Notice how we are accessing date value inside // the \DateTime object! We use dot notation to // access deep values. // For instance, registeredOn.timezone will be // ignored because we are not mapping 'registeredOn.date' => 'created_at', ]; } /** * @param array $data * @return User */ public function fromArray(array $data) { return new User( $data['user_id'], $data['username'], $data['public_username'], $data['email'], new \DateTime($data['created_at']) ); } /** * The automatic generated strategy used will be the data-store's if set to true. */ public function autoGenerateId() : bool { return true; } }
映射仓库
最后,其用法非常直接
use NilPortugues\Foundation\Infrastructure\Model\Repository\Sql\SqlRepository; use NilPortugues\Foundation\Infrastructure\Model\Repository\Sql\SqlRepositoryHydrator; class UserRepository extends SqlRepository { use SqlRepositoryHydrator; } $pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password'); $mapping = new UserMapping(); $repository = new UserRepository($pdo, $mapping);
仓库
仓库类实现了与数据交互和过滤所需的所有方法。
通过扩展SqlRepository类,SqlRepository可以默认处理所有CRUD操作。
如果您不使用CRUD,还可以有只读、只写和分页仓库
- 对于只读仓库,扩展
SqlReadRepository类。 - 对于只写仓库,扩展
SqlWriteRepository类。 - 对于分页仓库,扩展
SqlPageRepository类。
方法
在SqlRepository中可用
SqlWriteRepository、SqlReadRepository和SqlPageRepository下列出的所有方法。
在SqlWriteRepository中可用
public function add($value)public function addAll(array $values)public function remove(Identity $id)public function removeAll(Filter $filter = null)public function transactional(callable $transaction)public function count(Filter $filter = null)public function exists(Identity $id)public function getDriver()
在SqlReadRepository中可用
public function find(Identity $id, Fields $fields = null)public function findBy(Filter $filter = null, Sort $sort = null, Fields $fields = null)public function findByDistinct(Fields $distinctFields, Filter $filter = null, Sort $sort = null, Fields $fields = null)public function count(Filter $filter = null)public function exists(Identity $id)public function getDriver()
在SqlPageRepository中可用
public function findAll(Pageable $pageable = null)public function count(Filter $filter = null)public function exists(Identity $id)public function getDriver()
数据操作
所有数据都可以通过字段名称、使用过滤器、应用排序和分页提取,能够应用字段、过滤器和排序标准。
字段
通过字段选择将导致加湿失败。目前不支持部分对象加湿。
类: NilPortugues\Foundation\Domain\Model\Repository\Fields
方法
public function __construct(array $fields = [])public function add($field)public function get()
过滤
类: NilPortugues\Foundation\Domain\Model\Repository\Filter
方法
public function filters()public function must()public function mustNot()public function should()public function clear()
对于must()、mustNot()和should(),可用的方法有
public function notStartsWith($filterName, $value)public function notEndsWith($filterName, $value)public function notEmpty($filterName)public function empty($filterName)public function startsWith($filterName, $value)public function endsWith($filterName, $value)public function equal($filterName, $value)public function notEqual($filterName, $value)public function includeGroup($filterName, array $value)public function notIncludeGroup($filterName, array $value)public function range($filterName, $firstValue, $secondValue)public function notRange($filterName, $firstValue, $secondValue)public function notContain($filterName, $value)public function contain($filterName, $value)public function beGreaterThanOrEqual($filterName, $value)public function beGreaterThan($filterName, $value)public function beLessThanOrEqual($filterName, $value)public function beLessThan($filterName, $value)public function clear()public function get()public function hasEmpty($filterName)
分页
分页由两个对象处理,一个是具有分页要求的Pageable,另一个是包含分页数据的实际页面Page,例如页码、总数和数据。
分页的
类: NilPortugues\Foundation\Domain\Model\Repository\Pageable
方法
public function __construct($pageNumber, $pageSize, Sort $sort = null, Filter $filter = null, Fieldse $fields = null)public function offset()public function pageNumber()公共函数 sortings()公共函数 next()公共函数 pageSize()公共函数 previousOrFirst()公共函数 hasPrevious()公共函数 first()public function filters()公共函数 fields()
分页对象
类: NilPortugues\Foundation\Domain\Model\Repository\Page
方法
公共函数 __construct(array $elements, $totalElements, $pageNumber, $totalPages, Sort $sort = null, Filter $filter = null, Fields $fields = null)公共函数 content()公共函数 hasPrevious()公共函数 isFirst()公共函数 isLast()公共函数 hasNext()公共函数 pageSize()public function pageNumber()公共函数 totalPages()公共函数 nextPageable()公共函数 sortings()public function filters()公共函数 fields()公共函数 previousPageable()公共函数 totalElements()公共函数 map(callable $converter)
排序
类: NilPortugues\Foundation\Domain\Model\Repository\Sort
方法
公共函数 __construct(array $properties = [], Order $order = null)公共函数 andSort(SortInterface $sort)公共函数 orders()公共函数 equals(SortInterface $sort)公共函数 orderFor($propertyName)公共函数 setOrderFor($propertyName, Order $order)公共函数 property($propertyName)
排序
有时您想按多个字段排序,这时就需要用到 Order 类。
类: NilPortugues\Foundation\Domain\Model\Repository\Order
方法
公共函数 __construct($direction)公共函数 isDescending()公共函数 isAscending()公共函数 __toString()公共函数 equals($object)公共函数 direction()
--
质量
要在命令行运行 PHPUnit 测试,请转到测试目录并执行 phpunit。
如果您发现遵守上的疏忽,请通过 Pull Request 提交补丁。
贡献
欢迎对包的贡献!
支持
您可以通过以下方式之一与我联系
- 通过电子邮件 contact@nilportugues.com 发送给我
- 打开 问题
作者
许可证
代码库采用 MIT 许可证。