ilias/maestro

PHP面向对象的PostgreSQL数据库管理器

1.2.2 2024-09-29 06:32 UTC

This package is auto-updated.

Last update: 2024-09-29 06:36:58 UTC


README

Maintainer Maintainer Package Source Code Software License

Maestro 是一个PHP库,旨在简化PostgreSQL数据库模式和表的创建与管理。它允许开发人员使用PHP类定义模式和表,提供了一种清晰和结构化的方式来管理数据库定义和关系。

目录

安装

要安装Maestro,请使用Composer

composer require ilias/maestro

模式和表类

Maestro使用抽象类来定义模式和表。开发人员可以通过扩展这些类来定义自己的模式和表。

定义模式和表

模式类

一个模式类扩展了Schema抽象类。它包含表属性,这些属性用表类进行类型化。

表类

一个表类扩展了Table抽象类。它可以定义列作为类属性,指定它们的类型和可选的默认值。

唯一列

您可以通过覆盖表类中的tableUniqueColumns方法来指定应具有唯一性的列。您还可以通过将@unique子句添加到您想使其唯一的属性文档中来定义一个唯一列。如果覆盖了tableUniqueColumns方法,则此格式将不起作用。

默认值

列可以具有默认值。如果默认值是PostgreSQL函数,则应将其定义为PostgresFunction类型,以确保它不会在最终的SQL查询中加引号。

DatabaseManager

DatabaseManager类提供用于创建模式、表和管理外键约束的方法。

创建模式和表

createSchemacreateTable方法生成用于创建模式和表的SQL查询。createTablesForSchema方法处理创建模式内的所有表及其外键约束。

外键约束

在创建表后,使用ALTER TABLE语句添加外键约束。

执行查询

executeQuery方法使用PDO实例执行生成的SQL查询。

查询构建器

Maestro为常见的SQL操作提供了查询构建器类:SelectInsertUpdateDelete

选择

Select类允许您构建和执行SELECT查询。

use Ilias\Maestro\Database\Select;
use Ilias\Maestro\Database\PDOConnection;

$select = new Select(PDOConnection::getInstance());
$select->from(['u' => 'users'], ['u.id', 'u.name'])
       ->where(['u.active' => true])
       ->order('u.name', 'ASC')
       ->limit(10);

$sql = $select->getSql();
$params = $select->getParameters();

插入

Insert类允许您构建和执行INSERT查询。

use Ilias\Maestro\Database\Insert;
use Ilias\Maestro\Database\PDOConnection;
use Maestro\Example\User;

$user = new User('John Doe', 'john@example.com', md5('password'), true, new Timestamp('now'));

$insert = new Insert(PDOConnection::getInstance());
$insert->into(User::class)
       ->values($user)
       ->returning(['id']);

$sql = $insert->getSql();
$params = $insert->getParameters();

更新

Update类允许您构建和执行UPDATE查询。

use Ilias\Maestro\Database\Update;
use Ilias\Maestro\Database\PDOConnection;

$update = new Update(PDOConnection::getInstance());
$update->table('users')
       ->set('name', 'Jane Doe')
       ->where(['id' => 1]);

$sql = $update->getSql();
$params = $update->getParameters();

删除

Delete类允许您构建和执行DELETE查询。

use Ilias\Maestro\Database\Delete;
use Ilias\Maestro\Database\PDOConnection;

$delete = new Delete(PDOConnection::getInstance());
$delete->from('users')
       ->where(['id' => 1]);

$sql = $delete->getSql();
$params = $delete->getParameters();

示例

定义模式和表

<?php

namespace Maestro\Example;

use Ilias\Maestro\Abstract\Schema;
use Ilias\Maestro\Abstract\Table;
use Ilias\Maestro\Abstract\PostgresFunction;
use Ilias\Maestro\Types\Timestamp;

final class Hr extends Schema
{
    public User $user;
}

final class User extends Table
{
  public Hr $schema;
  public string $username;
  public string $email;
  public string $password;
  public Timestamp | PostgresFunction | string $createdIn = "CURRENT_TIMESTAMP";

  public function __construct(
    string $username,
    string $email,
    string $password,
    Timestamp $createdIn
  ) {
    $this->username = $username;
    $this->email = $email;
    $this->password = $password;
    $this->createdIn = $createdIn;
  }

  public static function tableUniqueColumns(): array
  {
    return ["username", "email"];
  }
}

说明

  • final:使用final指令声明您的TableSchemaDatabase类。这是应用程序跟踪创建实体的方式。
  • type:声明所有类属性的类型,以便应用程序可以从数据库列更好地选择等效的数据类型。
  • __construct:构造方法用于定义数据库列的非空性。将必须非空的列添加到构造函数参数中。
  • default:要声明默认值,只需将初始值添加到类属性中即可。
  • 自定义函数:要将PostgreSQL函数用作默认值,请遵循前面的步骤,并在属性类型中添加以下两个类型:<当前类型> | PostgresFunction | string,然后添加为值文本将用作函数。
  • 唯一:重写tableUniqueColumns静态方法以返回唯一列的名称。或者,在属性的文档中使用@unique子句,但请注意,如果重写了tableUniqueColumns,则这不会起作用。

生成SQL查询

您的文件通常应包括以下变量

  1. DB_SQL:PHP数据源驱动程序名称。
  2. DB_HOST:您的数据库服务器的主机名。
  3. DB_PORT:您的数据库服务器正在运行的端口号。
  4. DB_NAME:您想要连接到的数据库名称。
  5. DB_USER:用于连接到数据库的用户名。
  6. DB_PASS:用于连接到数据库的密码。

以下是为您的.env文件需要的内容

DB_SQL=pgsql
DB_HOST=localhost
DB_PORT=5432
DB_NAME=maestrodb
DB_USER=postgres
DB_PASS=dbpass
<?php

require_once 'vendor/autoload.php';

use Ilias\Maestro\Database\DatabaseManager;
use Ilias\Maestro\Database\PDOConnection;
use Maestro\Example\Hr;
use PDO;

// Initialize PDO with environment variables
$pdo = PDOConnection::getInstance();

// Initialize DatabaseManager
$dbManager = new DatabaseManager($pdo);

// Create schemas and tables based on the defined classes
$queries = $dbManager->createTablesForSchema(new Hr());

foreach ($queries as $query) {
    $dbManager->executeQuery($pdo, $query);
}

命令

Maestro提供了一些命令来帮助您管理和同步您的数据库模式。以下是可用的命令

sync-schema

同步特定模式类的模式。此命令确保指定的类的数据库模式与您在PHP代码中定义的模式匹配。

用法
./vendor/bin/maestro sync-schema <SchemaClass>
示例
./vendor/bin/maestro sync-schema Maestro\\Example\\Hr

此命令将同步Hr模式,确保数据库中Hr模式的表和列与PHP代码中的定义匹配。

sync-database

同步指定数据库类的整个数据库模式。此命令遍历数据库类中定义的所有模式,并确保数据库中的每个模式都与您在PHP代码中定义的模式匹配。

用法
./vendor/bin/maestro sync-database <DatabaseClass>
示例
./vendor/bin/maestro sync-database Maestro\\Example\\MaestroDb

此命令将同步MaestroDb类中定义的所有模式,确保每个数据库中的表和列与PHP代码中的定义匹配。