crimanne / abstract-repo
这是一个轻量级的库,用于抽象仓库并避免编写大量的仓库逻辑。
Requires
- php: ^8.3
Requires (Dev)
- phpunit/php-code-coverage: ^10.1
- phpunit/phpunit: ^10.2
README
关于
本项目是一个轻量级库,用于抽象仓库并避免编写大量仓库逻辑。它使用 反射 和 PHP 8 属性 在抽象类(AbstractRepository)中提供基本的 CRUD 方法。
可用方法
- find : 获取所有记录
- findFirst : 获取第一条记录
- findByQuery : 获取与给定查询匹配的所有记录
- findById : 获取特定记录
- findWhere : 获取与 WHERE 子句匹配的所有记录
- save : 保存传递的模型
- update : 更新传递的模型
- delete : 根据ID删除模型
- getMappedObject : 返回传递的模型作为数组的新的实例
安装
您可以使用以下命令使用 composer 安装此库:
composer require crimanne/abstract-repo
使用方法
基本上,您需要定义 实体 和将使用它的仓库。
实体
您需要定义一个类,该类是数据库中已创建的实体,并给它 实体 属性。实体属性需要数据库表名称作为参数。该模型必须实现 IModel 接口,如下所示
例如:
#[Entity(tableName: 'Foo')]
class Foo implements IModel{
}
然后您需要定义必须与数据库中的字段匹配的字段。
主键
要定义主键,您必须在字段上使用 主键 属性。该属性接受一个布尔值作为构造函数参数,指示主键是否是 自增。
例如:
...
#[PrimaryKey(autoIncrement: true)]
public int $id,
...
外键(ManyToOne,OneToOne,OneToMany)
在实体中处理外键时,您可以选择以下属性之一
- ManyToOne: 此属性使您可以在父类中直接拥有子对象。
- OneToOne: 与 ManyToOne 类似,此属性在尝试插入具有相同外键的另一个记录时添加约束检查。
- OneToMany: 此属性允许您在获取数据时指定包含所有相关实体ID的数组。
ManyToOne 和 OneToOne 属性需要在构造函数中提供 columnName 参数。此参数用于将外键映射到数据库中的列名。
例如:
...
#[ManyToOne(columnName: 'bar_id')
public Bar $bar,
...
要有一个 OneToMany 关系,您需要声明一个可空数组,它将包含所有相关的ID。该属性需要两个参数
- referencedColumn: 参考表中数据库列名。
- referenceClass: 参考类
在示例中,您可以看到一个 Author 和 Book 之间的 OneToMany 关系。在 book 表中必须有一个 author_id 列,以便完成关系。
#[Entity('Author')
class Author implements IModel
...
#[OneToMany(
referencedColumn: 'author_id',
referencedClass: Book::class
)]
public ?array $books = null
...
可搜索
该存储库提供了一个名为 findByQuery 的实用方法,它将接受一个查询搜索词,并检索所有匹配(即使部分匹配)该查询的记录。为了实现这一点,您需要在模型中指定可以使用哪些字段进行搜索,使用属性 Searchable。如果该属性应用于一对一或多对一关系属性,该方法还会在相关模型中查找所有可搜索的字段。请注意,此过程只能获取直接相关实体的可搜索字段,并且不会超过嵌套的一级。
例如:
...
#[Searchable]
public string $field,
...
存储库
定义实体后,您必须创建一个继承自 AbstractRepository 类的存储库。然后您需要定义 getModel 方法,以返回您想在该存储库中处理的实体的类名。
例如:
class FooRepository extends AbstractRepository implements IRepository{
...
static public function getModel():string{
return Foo::class;
}
...
}
存储库在构造时需要一个 PDO 实例,这也可以通过 依赖注入 完成。
演示
一个小型演示项目可以在 demo/ 文件夹中找到
版权所有 2024 Cristian Mannella
AbstractRepo 由 Cristian Mannella 编写,许可协议为 Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International