openpsa / midgard-portable
基于Doctrine 2构建的ActiveRecord ORM
Requires
- php: >=7.4
- ext-xml: *
- doctrine/dbal: ^3.5
- doctrine/orm: ^2.13
- monolog/monolog: ^1.15 || ^2.0
- symfony/cache: >=4.4.0
- symfony/console: >=3.0.0
Requires (Dev)
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-13 16:14:22 UTC
README
这个库提供了一个基于Doctrine 2构建的ActiveRecord ORM,并模仿了Midgard API。
简而言之
您可以使用XML(通常称为MgdSchema)定义您的实体
<type name="my_person" table="person"> <property name="id" type="unsigned integer" primaryfield="id"> <description>Local database identifier</description> </property> <property name="firstname" type="string" index="yes"> <description>First name of the person</description> </property> <property name="lastname" type="string" index="yes"> <description>Last name of the person</description> </property> </type>
运行midgard-portable schema
将会创建相应的数据库表和一个PHP类(通常称为MgdSchema类)。您可以使用它来读取和写入数据库
// create a new person $person = new my_person(); $person->firstname = 'Alice'; if ($person->create()) { echo 'Created person #' . $person->id; } // load a new copy of the same person $loaded = new my_person($person->id); $loaded->firstname = 'Bob'; if ($loaded->update()) { echo 'Renamed from ' . $person->firstname . ' to ' . $loaded->firstname; }
midgard-portable会自动向记录添加元数据
$person = new my_person(); $person->firstname = 'Alice'; $person->create(); sleep(1); $person->lastname = 'Cooper'; $person->update(); echo 'Person was created on ' . $person->metadata->created->format('Y-m-d H:i:s'); echo ' and last updated on ' . $person->metadata->updated->format('Y-m-d H:i:s');
它也支持软删除
$person = new my_person(); $person->firstname = 'Alice'; $person->create(); $person->delete(); try { $loaded = new my_person($person->id); } catch (midgard_error_exception $e) { echo $e->getMessage(); // prints "Object does not exist." } // Revert the deletion my_person::undelete($person->guid); // or remove the entry completely $person->purge();
您可以通过以下方式查询条目
$qb = new midgard_query_builder('my_person'); $qb->add_constraint('metadata.created', '>', '2012-12-10 10:00:00'); $qb->add_order('firstname'); foreach ($qb->execute() as $result) { echo $result->lastname . "\n"; }
或者,您可以直接使用Doctrine的内置QueryBuilder
。
然后,还有对象树、链接、文件处理、数据导入/导出等很多功能,但直到有时间来记录所有这些,您可能需要阅读源代码来了解(单元测试也可能是一个好的起点)。
使用方法
要将midgard-portable
包含到您的应用程序中,只需在您的composer.json
中require
它。您可以像这样启动适配器
<?php use midgard\portable\driver; use midgard\portable\storage\connection; $db_config = [ 'driver' => 'pdo_sqlite', 'memory' => true ]; $schema_dirs = ['/path/to/my/schemas/']; $var_dir = '/path/to/vardir'; $entity_namespace = ''; $dev_mode = false; $driver = new driver($schema_dirs, $var_dir, $entity_namespace); connection::initialize($driver, $db_config, $dev_mode);
根据需要更改参数。在调用connection::initialize()
之后,您可以通过Midgard API以概述的方式与数据库进行交互。
CLI工具
midgard-portable
需要生成实体类以及为Doctrine生成ClassMetadata
和Proxy
类。在开发环境中,这会在每个请求上自动完成。对于生产安装,您可以使用以下CLI命令
./bin/vendor/midgard-portable schema
它的工作方式与旧版的midgard-schema
工具非常相似,即它会根据MgdSchema XML文件、相关的映射数据以及代理类生成midgard_object
类,并创建/更新相应的数据库表。您在初始安装期间需要运行此命令一次,每次MgdSchemas更改时也需要再次运行。
如果您创建一个名为cli-config.php
的文件,并包含以下内容,您也可以使用Doctrine的CLI运行器和它提供的一切功能
<?php use midgard\portable\storage\connection; require 'my_settings_file.php'; //This needs to contain the code shown above $entityManager = connection::get_em();