dafeiw/dahuang

轻量级 ORM,使用 DataMapper 模式,PHP 5.3+

0.5.0 2013-03-12 14:41 UTC

This package is not auto-updated.

Last update: 2024-09-14 12:32:42 UTC


README

Cactus 是一个用于 PHP 5.3+ 的 ORM,使用 DataMapper 模式

示例

我们将通过一个快速示例来了解如何使用 Cactus。首先,我们将从一个名为 user 的表开始,我们将围绕这个表构建示例。

CREATE TABLE IF NOT EXISTS `user` (
	`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
	`email` varchar(128) NOT NULL,
	`password` varchar(64) DEFAULT NULL,
	`first_name` varchar(50) NOT NULL,
	`last_name` varchar(50) NOT NULL,
	`status` tinyint(3) unsigned NOT NULL DEFAULT '1',
	`create_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
	PRIMARY KEY (`user_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

在这个结构下,我们现在可以深入到模型和实体类。

映射器

映射器类包含了关于它所映射的数据库表的所有信息,包括表名和主键。

下面是我们的 user 表的模型类。

<?php

class UserMapper extends \Cactus\Mapper
{
	/**
	 * Use the init() function so you don't have to mess with handling the
	 * adapter injection in the constructor.
	 */
	protected function init()
	{
		$this->table = "user";
		$this->primary_key = "user_id";

		$this->columns = array(
			'user_id' => 'integer',
			'email' => 'string',
			'password' => 'string',
			'first_name' => 'string',
			'last_name' => 'string',
			'status' => 'integer'
			'create_date' => 'dateTime'
		);
	}
}

映射器类并不知道如何连接到你的数据源,所以你需要自己指定。

<?php


$pdo = new PDO($dsn, $username, $password);
$adapter = new \Cactus\Adapter\PDO($pdo);

$mapper = new UserMapper($adapter);

如你所见,适配器需要被注入到类中,所以使用依赖注入容器来完成这个任务可能更明智。

有关创建 PDO 连接的更多信息,请参阅 PDO 文档。

如果你正在使用框架或者没有 PDO 可用,你很幸运,因为你可以轻松创建适配器来满足你的需求。你所需要做的就是实现 \Cactus\Adapter 接口,并将该适配器注入到 Cactus 中。

实体

实体是每个数据行作为对象的表现形式。所有验证和数据归一化都应包含在实体中。

下面是我们用户的示例实体类。

<?php

class User extends \Cactus\Entity{}

很简单,对吧?

查询

内置了 3 种类型的查询;查找、保存和删除。

查找

<?php

// Find the user with a user_id of 1
$user = $mapper->get(1);

// Get all users
$users = $mapper->all();

// Find user who's email is test@foo.com
$found = $mapper->find(array(
	'email' => "test@foo.com"
));

保存

<?php

// New user assuming $post is posted form data
$user = new User($post);
$mapper->save($user);

// Existing user, after modifications
$user = $mapper->get(1);
$user->first_name = "Billy";
$mapper->save($user);

echo $user->first_name; // Output: Billy

删除

<?php

$user = $mapper->get(1);
$mapper->delete($user);

定义列

定义列的目标不是生成创建表的 SQL,而是将数据库中的字符串值转换为原生 PHP 类型。

让我们看一下上面 UserMapper 中的示例

<?php

$this->columns = array(
	'user_id' => 'integer',
	'email' => 'string',
	'password' => 'string',
	'first_name' => 'string',
	'last_name' => 'string',
	'status' => 'integer'
	'create_date' => 'dateTime'
);

如你所见,列数组设置为 $name => $type 的形式。有关你可以选择的完整字段类型列表,请查看 \Cactus\Converter 的文档。将字段设置为 false 将使其保持字符串类型。

构建查询

你可以按任何方式构建模型中自定义方法的查询。如果你想要以面向对象的方式构建查询,Cactus 内置了 Peyote

支持的适配器

以下是目前支持的适配器列表。如果你的框架没有在列表中,你可以修改代码并发送拉取请求。

  • PDO

修改

Cactus 正在积极开发,所有贡献都受到欢迎和鼓励。在你开始修改代码之前,请确保切换到 develop 分支。

运行测试

在你发送任何更改的拉取请求之前,请确保 phpunit 测试通过,并在必要时添加测试。

由于这是一个 ORM,你需要测试数据库。要连接到数据库,你需要修改 phpunit.xml 文件的 php 部分,以包含你的设置。在提交更改之前,请确保运行...

git update-index --assume-unchanged phpunit.xml

这样就不会将你的用户名/密码推送到仓库。

Dave Widmer 开发