sunhill/orm

sunhill ORM 扩展至 Laravel

dev-main 2024-01-21 19:42 UTC

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

另请参阅

+

开发者资源 +已知问题