granadaorm/builder

Granada ORM 模型的类自动生成

1.4.11 2024-01-29 03:36 UTC

README

Latest Stable Version Build Status

Granada ORM 模型和控制器类构建器

安装

使用 composer 轻松安装

composer require granadaorm/builder

我强烈建议获取表单组件,它也会引入 builder

composer require granadaorm/form

介绍

GranadaORM 是一个出色的 ORM,但是创建和管理大型系统中每个表的类可能会变得繁琐。Builder 通过分析数据库结构(目前只支持 MySQL)并自动构建模型和控制器所需的类来解决此问题。

额外的好处是,现代 IDE 将为模型中可用的元素和函数提供自动完成功能。

概述

与 GranadaORM 交互时,与模型交互有两种主要模式:构建查询和操作查询结果。

Builder 创建一个 \Granada\Model 的扩展类级别,以添加功能并分隔这两种操作模式

  • 查询类包含帮助过滤数据库以获取所需结果集的功能
  • 基本类包含数据元素和操作单个或多个记录数据的函数

层次结构

让我们以 People 表为例。它有如下字段

创建了一个 \Myapp\Person 类,它扩展了 \Myapp\BasePerson,该类扩展了你配置中定义的类,以便进行系统级别的扩展。该类需要扩展 \Granada\Builder\ExtendedModel,它扩展了 \Granada\Model

添加的功能

为了使 Granada 模型更有用,为所有由 Builder 创建和管理的模型添加了以下函数和功能

  • 保存前/后 - 在每次保存操作之前和之后调用函数

  • 插入前/后 - 在将记录插入表之前和之后调用函数。仅在该条目第一次保存时发生。上面的保存前/后函数也会被调用。

  • 删除前/后 - 在从数据库中删除记录之前和之后调用函数

  • 表示 - 定义一个或多个字段和显示函数(默认为表中第一个非空字段),用作行的表示。例如,上面的 Person 记录可以将 first_name 和 last_name 字段组合成行的全名表示。

  • find_pairs_representation() - 从数据库中提取数据并返回一个数组,其中行的 ID 作为键,模型的表示作为值。

  • 日期和时间 字段由 CakePHP 的 Chronos 库表示。数据库字段都使用相同的时区(默认和推荐为 UTC)进行存储,但可以可选地在每个字段的基础上配置时区或不使用时区。接口是自动的,时区问题已经成为过去式!

  • 排序顺序 自动化使用默认值为 "0" 的整数 sort_order 字段,当创建时自动设置为列表末尾的顺序

  • 重新加载刷新功能用于从数据库获取新鲜内容。在保存时会自动执行此操作,以确保相关数据不会过时。

  • 输入数据将被正确返回,因此整数字段返回整数,布尔型(tinyint(1))返回布尔值。这使得输出REST接口的JSON更加简洁。

  • 复数单数版本的模型名称。使用humanName()获取"Person",使用humanNames()获取"People"。

用法

以下是一些示例,说明如何使用这些类通过Granada更轻松地与数据库交互。

查询

使用上述示例,获取最近更新的50个人的列表

$people = \Myapp\Person::q()
          ->order_by_updated_at_desc()
          ->limit(50)
          ->find_many();

foreach ($people as $person) {
    echo $person->representation();
}

现在让我们获取所有姓"Smith"的人的列表

$people = \Myapp\Person::q()
          ->where_last_name('Smith')
          ->order_by_first_name()
          ->find_many();

foreach ($people as $person) {
  echo $person->first_name;
  echo $person->created_at_chronos->toDateString();
}

有关更多功能,请参阅BasePerson.phpQueryPerson.php文件顶部的列表。

构建设置

构建系统需要知道文件存放位置、如何访问数据库以及如果没有使用命名空间前缀命名表名,应使用哪个命名空间。如果你没有使用命名空间前缀命名表名,则需要指定。

创建配置文件

创建一个类似于以下内容的json配置文件

{
  "db_host": "database",
  "db_name": "db_name",
  "db_username": "db_user",
  "db_password": "db_pass",
  "models_output_dir": "Auto",
  "model_to_extend": "\\MyAppCore\\ORMBaseClass",
  "controller_model_to_extend": "\\MyAppCore\\Controller",
  "use_namespaces": false, // If set to true, you don't need the next two and it splits the namespace from the prefix of the table name
  "default_namespace": "MyAppTest",
  "namespace_prefixes": [
    'blog', // Blog namespace has table names starting with "blog_"
  ]
}

该配置文件应该放置在您的脚本可以运行的位置。例如,在示例中,输出目录与配置文件位于同一目录。

将目录添加到自动构建器

在您的系统index.php或主入口点/配置包含中,添加一个自动加载器,以便在访问时加载这些创建的类。例如,您可以使用类似以下内容 - 适当调整您的文件夹


$base_autoload_folder = __DIR__ . '/models';

spl_autoload_register(function ($classname) {
    $nsmodel = explode('\\', $classname);
    if (count($nsmodel) > 1) {
        $filename = $base_autoload_folder . "/" . $nsmodel[0] . '/' . $nsmodel[1] . ".php";
        if (file_exists($filename)) {
            include($filename);
        }

        $filename = $base_autoload_folder . "/cms/" . $nsmodel[0] . '/Models/' . $nsmodel[1] . ".php";
        if (file_exists($filename)) {
            include($filename);
        }

        $filename = $base_autoload_folder . "/cms/" . $nsmodel[0] . '/Models/_base/' . $nsmodel[1] . ".php";
        if (file_exists($filename)) {
            include($filename);
        }

        $filename = $base_autoload_folder . "/cms/" . $nsmodel[0] . '/Controllers/' . $nsmodel[1] . ".php";
        if (file_exists($filename)) {
            include($filename);
        }
    }
});

在上面的示例中,我们有一个结构,其中模型和控制器扩展类位于$base_autoload_folder中,下面是cms文件夹,其中包含配置文件,以及所有创建的类。

进行实际构建

运行./vendor/bin/granadabuild /path/to/config/file

如果您的数据库有大量表,这可能需要一分钟。

请注意,构建器为每个表创建四个文件。对于上面的myapp_person表,构建器将创建

  • /cms/Myapp/Models/Person.php

  • /cms/Myapp/Models/_base/BasePerson.php

  • /cms/Myapp/Models/_base/QueryPerson.php

  • /cms/Myapp/Controllers/PersonController.php

只有_base中的文件是自动管理的 - 其他两个文件是用于修改特定于该表中数据的类的,应由您的版本控制系统管理。您应该忽略_base文件夹,并在每次系统更新时在服务器上自动生成这些文件夹。

更多信息

查看生成的源代码,查看Builder ExtendedModel以及测试,了解如何使用该系统。