sunhill /orm
sunhill ORM 扩展至 Laravel
Requires
- doctrine/dbal: 3.7.x
- sunhill/basic: *
Requires (Dev)
- brianium/paratest: 7.x-dev
- orchestra/testbench: ^8.5
- phpunit/phpunit: ^10.0
This package is auto-updated.
Last update: 2024-09-30 12:27:04 UTC
README
sunhill项目的基本ORM框架提供了一个Object-Relational-Manager扩展,用于Laravel框架。与Eloquent相反,sunhill ORM项目尊重继承。这意味着您可以使用映射到数据库表的类层次结构树。因此,很容易搜索某个对象的子代对象。
与Eloquent的主要区别
虽然Eloquent将对象存储在扁平表中,但无法处理对象的依赖关系。例如,有两个类:祖先类是'Person',后代类是'Friend'。每个朋友都是人,但不是每个人都是朋友。因此,没有必要存储人的地址,但对于朋友来说是有用的。现在可以轻松搜索所有名为'Smith'的朋友(如Friend::search()->where('lastname','Smith')),也可以对人员进行相同的操作(Person::search()->where('lastname','Smith'))。在第一个例子中,只返回具有该名称的朋友,在第二个例子中,返回所有具有该名称的人(包括朋友)。在Eloquent中,可以有Friend和Person模型,但它们彼此不相关。
安装
使用composer安装sunhill/orm及其依赖项
composer require sunhill-de/orm
基本用法
要使对象利用sunhill ORM框架,它必须由ORMObject类派生。这个基本类定义了commit()和rollback()方法,用于将任何更改持久化或相应地撤销字段(称为属性)。必须通过静态setup_properties()方法定义属性。它们必须是Property的任何后代。之后,它们可以作为正常的类成员访问。
示例
class test extends ORMObject { protected static function setupProperties(PropertyList $list) { $list->integer('dummyint')->searchable()->default(1); } protected static function setupInfos() { static::addInfo('name', 'test'); static::addInfo('table', 'tests'); static::addInfo('description', 'A demonstration class'); } } class extendedtest extends test { protected static function setupProperties(PropertyList $list) { $list->varchar('dummystring')->searchable()->default(1); } protected static function setupInfos() { static::addInfo('name', 'extenedtest'); static::addInfo('table', 'extendedtests'); static::addInfo('description', 'A derrived demonstration class'); } } ... { $test = new extendedtest(); $test->dummystring = 'ABC'; $test->dummyint = 3; $test->commit(); // writes the object to database (or storage) $id = $test->getID(); // Gives the numeric ID of this object echo $id; ... $test = Objects::load($id); echo $test->dummystring; // writes ABC echo $test->dummyint; // writes 3 $test->dummystring = 'DEF'; echo $test->dummystring; // writes DEF $test->commit(); // Writes the changes to database (or storage) $anothertest = Objects::load($id); echo $anothertest->dummystring; // writes DEF echo $test->dummystring; // writed DEF }
注册类
应该将类注册到类管理器中,以获取对它们的访问权限。每个类都必须有一个唯一的名称(目前还没有命名空间),该名称在setupInfo()方法中定义。通过此名称,可以在orm系统中访问类。为了使系统(在这种情况下为类管理器)找到这些类,必须通过Classes::registerClass()方法注册它们。如果使用Laravel,最好将此注册放在ServiceProvider的boot()方法中。
... use Sunhill\ORM\Facades\Classes; ... class SomeServiceProvider extends ServiceProvider { ... public function boot() { ... Classes::registerClass(test::class); Classes::registerClass(externdedtest::class); ... } ... }
核心概念
属性
每个对象都由属性组成。有简单的属性,如字符串、整数等。有简单属性的数组和平面映射(目前还没有数组数组)。还有对象和集合。属性在类的静态setupProperties()方法中定义。类可以省略此方法,因此该类不会定义自己的属性。该方法接受一个PropertyList对象作为参数,所有定义都必须针对此参数进行。
... class testclass extends ORMObject { protected static function setupProperties(PropertyList $list) { $list->integer('integer_field'); } } ...
稍后,属性可以像正常类成员一样访问(例如,"$test->integer_field")。存在内部验证分配的值(因此$test->integer_field = "ABC"将引发异常)。数组属性可以像正常数组成员一样访问($test->array_field[1])。存在属性类型"object",它接受其他ORMObjects作为值。这些可以通过这种方式访问:$test->object_field->some_property。有关更多信息,请参阅属性
集合和ORMObject
虽然核心组件是ORMObject,但还有一个更简单的形式,称为Collection。区别在此处说明
集合
集合是一个简单的平面对象到数据库映射,类似于Eloquent。没有层次结构,但处理集合时的开销较少。请参阅集合
ORMObject
ORMObject(对象关系映射)是编写此包的主要动机。它提供了一种将层次结构类结构映射到数据库的简单方法。请参阅集合
类与对象
通常,类与对象之间存在差异。类是对象的蓝图,而对象是类的具体实现。因此,有两个独立的界面用于访问有关类(称为类,请参阅ClassManager)和对象(称为对象,请参阅ObjectManager)的信息。
存储
编写sunhill ORM包的主要目的是将对象存储到数据库中。但存储的概念允许您将对象存储在任何您想要的地方(文件、数据库、网站)。为了实现这一点,存在存储的概念。集合和ORMObject管理属性和“脏”的概念,而存储负责读取、创建、修改和擦除数据到和从具体的存储。对象通过存储界面(请参阅StorageManager)与所需的存储进行通信。有关更多信息,请参阅存储
标签
标签是可以附加到对象的字符串。标签以分层方式管理,因此一个标签可以有多个子标签。标签的管理由标签界面(请参阅TagManager)提供。有关更多信息,请参阅标签
属性
属性是可以在以后分配给对象的动态属性。这意味着某个对象可以具有此属性,但不必一定有。属性可以像正常属性或成员变量一样访问(读取和写入)。内部,ORM框架会寻找具有此名称的适当预定义属性,并检查此属性是否允许用于此类。如果是,则将属性动态添加到对象中,并可以像任何其他属性一样访问(存储在存储中并像任何其他属性一样加载)。有关更多信息,请参阅属性和属性界面(请参阅AttributeManager)。
其他实用工具
检查
ORM包定义了一个名为“sunhill:check”的artisan控制台命令,该命令执行多个预定义的检查。检查是对单个实体(如数据库结构)的简单一致性探测。通过执行./artisan sunhill:check,将执行所有这些检查,并返回是否存在任何实体的问题。该命令还具有--repair参数,该参数试图在同一运行中修复找到的问题。有关更多信息,请参阅检查。
迁移
ORM包定义了一个名为“sunhill:migrate”的artisan控制台命令,该命令为每个定义的类创建存储结构(如数据库表)。有关更多信息,请参阅迁移。
查询
ORM框架的所有实体(如属性、标签、类、对象)都应能够以Laravel执行数据库查询的形式进行查询(通过QueryBuilder)。因此,所有界面都定义了一个query()方法,该方法返回一个查询类,用于在QueryBuilder链中。有关更多信息,请参阅查询
InfoMarket
ORM子系统实现了一个称为InfoMarket的集中式信息交换系统。有关详细信息,请参阅InfoMarket
另请参阅
+
开发者资源 +已知问题