crimanne/abstract-repo

这是一个轻量级的库,用于抽象仓库并避免编写大量的仓库逻辑。

0.3.3 2024-07-13 16:36 UTC

This package is auto-updated.

Last update: 2024-09-13 17:07:08 UTC


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

AbstractRepoCristian Mannella 编写,许可协议为 Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International

CC BY NC ND