dafeiw / dahuang
轻量级 ORM,使用 DataMapper 模式,PHP 5.3+
Requires
- php: >=5.3
- davewid/peyote: 0.6.*
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 开发