doublemcz/dibi-orm

基于dibi的ORM系统

1.1.1 2015-01-18 20:25 UTC

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();
	}
}