doublemcz / dibi-orm
基于dibi的ORM系统
This package is not auto-updated.
Last update: 2024-09-14 16:55:29 UTC
README
Dibi ORM是基于Dibi的轻量级ORM解决方案。ORM逻辑来自Doctrine 2,但进行了极大的简化。同时,也注重性能。
安装
我建议您通过Composer进行安装。
composer require doublemcz/dibi-orm
如果您没有Composer,请从GitHub下载最新版本并要求引导文件。
require 'src/dibirom.php'
初始化
$parameters = array( 'database' => array( 'host' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'dibiorm', 'driver' => 'mysqli', ), 'entityNamespace' => 'App\Entities', 'proxiesPath' => __DIR__ . '/temp', 'storage' => new Nette\Caching\Storages\FileStorage('temp'), ); $databaseManager = new \doublemcz\dibiorm\Manager($parameters);
Nette中的使用
将此部分放入services.neon
extensions: dibi: Dibi\Bridges\Nette\DibiExtension22 services: databaseManager: doublemcz\dibiorm\Manager(%databaseManager%) parameters: databaseManager: database: host: localhost username: userName password: password database: database entityNamespace: App\Entities proxiesPath: '%tempDir%/proxies' storage: @cacheStorage
也可以将DibiConnection传递给参数'database'。
parameters: databaseManager: database: @dibiConnection
数据处理
通过ID获取实体
查找ID = 1的用户
$databaseManager->find('User', 1);
如果用户的主键有更多列,您可以根据在实体中定义键的顺序传递它们。
$user = $databaseManager->find('AnEntityName', 'foo', 'bar');
通过属性查找实体
我们可以通过电子邮件属性查找实体
$user = $databaseManager->findOneBy('User', array('email' => 'email@domain.com'));
获取表中的实体
在表'users'中查找所有用户
$users = $databaseManager->findBy('User');
您可以通过数组进行过滤和排序。我们正在尝试按id desc顺序查找角色为'admin'的用户。
$users = $databaseManager ->findBy( 'User', array('role' => 'admin'), array('id' => 'DESC') );
将实体插入到数据库中
$user = new User(); $user->name = 'Martin'; $databaseManager->persist($user); $databaseManager->flush();
更新实体
当您从存储库加载数据实体时,实体将由Manager自动管理。这意味着,如果您进行更改并通过Manager刷新更改,则会自动执行SQL查询。
$user = $databaseManager->find('User', 1); $user->note = 'An updated note on user 1'; $databaseManager->flush();
删除实体
$user = $databaseManager->find('User', 1); $database->delete($user); $databaseManager->flush();
数据库Manager知道哪些内容已更改
您可以在任何时候刷新。Manager知道哪些数据已更改,并在刷新时执行必要的操作。
$user = $databaseManager->find('User', 1); $user->note = 'An updated note on user 1'; $user2 = $databaseManager->find('User', 2); $user2->note = 'An updated note on user 2'; $user3 = $databaseManager->find('User', 3); $database->delete($user3); // Flush makes automatically two sql updates and one delete $databaseManager->flush();
实体设置
所有设置都由PhpDoc定义。每个实体都必须有@table标签来指定类PhpDoc上定义的源表。每个与数据库列有关联的类属性都必须有@column标签。
定义主列
每个实体都必须有主键。定义由@primaryKey和@column组成。如果您想设置由数据库在创建SQL查询中生成的id,请指定@autoIncrement标签。
关系
基本关系由@oneToOne和@oneToMany标签定义。两者都需要以下定义的连接规范标签:@join(column="id", referenceColumn="userId")。这意味着它将User.id列与RelatedTable.userId列连接。
真实示例
/** * @table (name="users") */ class User { /** * @oneToMany(entity="UserLog") * @join(column="id", referenceColumn="userId") * @var User */ protected $userLog; /** * @return UserLog[] */ public function getUserLog() { return $this->userLog; } }
静态连接参数
也可以指定静态连接参数来通过列过滤表。在这里,您可以看到定义user.type = 'error'的静态连接。静态连接仅在@oneToOne和@oneToMany关系上使用。
/** * @table (name="users") */ class User { /** * @oneToMany(entity="UserLog") * @join(column="id", referenceColumn="userId") * @staticJoin(column="type", value="error") * @var User */ protected $errorLog; /** * @return UserLog[] */ public function getErrorLog() { return $this->errorLog; } }
@manyToMany关系
多对多关系用于数据通过关系表连接时。
/** * @manyToMany(entity="AnEntityName", joiningTable="joining_table") * @joinPrimary(column="id", referenceColumn="userId") * @joinSecondary(column="userLogId", referenceColumn="id") * @var AnEntityName[] */ protected $foo;
事件
Manager基于类中包含的方法处理事件。目前我们有实体事件。
- beforeCreateEvent
- beforeUpdateEvent
事件使用示例。
您可以看到我们如何在执行创建或更新SQL之前更新实体。
/** * @param Manager $manager */ public function beforeCreateEvent(Manager $manager) { $this->createdAt = new \DateTime(); } public function beforeUpdateEvent(Manager $manager) { $this->updatedAt = new \DateTime(); }
用户实体定义示例
<?php namespace doublemcz\dibiorm\Examples\Entities; use doublemcz\dibiorm\Manager; /** * @table (name="users") */ class User { /** * @primaryKey * @autoIncrement * @column * @var int */ public $id; /** * @oneToMany(entity="UserLog") * @join(column="id", referenceColumn="userId") * @var User */ protected $userLog; /** * @oneToMany(entity="UserLog") * @join(column="id", referenceColumn="userId") * @staticJoin(column="type", value="error") * @var User */ protected $userErrorLog; /** * @oneToOne(entity="UserDetail") * @join(column="id", referenceColumn="userId") * @var UserDetail */ protected $detail; /** * @column * @var string */ public $fullname; /** * @column * @var \DateTime */ public $birthDate; /** * @column * @var \DateTime */ public $createdAt; /** * @column * @var \DateTime */ public $updatedAt; /** * @return UserLog[] */ public function getUserLog() { return $this->userLog; } /** * @return UserDetail */ public function getDetail() { return $this->detail; } /** * @param Manager $manager */ public function beforeCreateEvent(Manager $manager) { $this->createdAt = new \DateTime(); } public function beforeUpdateEvent(Manager $manager) { $this->updatedAt = new \DateTime(); } }