红帽白皮书新鲜出炉!点击获取,让你的云战略更胜一筹! 了解详情
写点什么

arrayDB,全新而且简单的 PHP ORM 库

  • 2012-10-26
  • 本文字数:3410 字

    阅读完需:约 11 分钟

我见过许多 PHP ORM 库。它们中大多数都要你为想保存在数据库里的每一项写一个类。无缘无故地继承这个、继承那个,而那些内容通常都是重复和反复无常的。

既然条目包含相似数据类型以及相似关系的字段,一个编写良好的类就可适用于所有情况。如果你需要一个库来简化这些事情,这就是我的方法。

arrayDB ORM 库只包含 5 个类。你基本上只使用其中一个,而其余类则在内部使用,仅此而已。缓存及其与数据库之间的同步全是自动的,你无需对其进行跟踪。

要开始使用这个库,你只需简单地定义:

  • 你的数据模型(你需要保存哪几项,他们的字段以及字段间的关系)。
  • 你的 MySQL 连接方式。
  • 你的缓存配置。

定义数据模型

所有的数据模型定义被写成像这样的数组:

复制代码
$model=array(
'user'=>array(
'conf'=>array('len'=>7),
'fields'=>array(
'name'=>array('len'=>50)
),
'has_many'=>array(
'posts'=>array('type'=>'post',
'foreign_name'=>'writer')
),
'many_to_many'=>array(
'liked_posts'=>array('type'=>'post',
'foreign_name'=>'likers'),
),
'self_ref'=>array('friends')
),
'post'=>array(
'conf'=>array('len'=>10),
'fields'=>array(
'text'=>array('len'=>200),
'view_count'=>array('type'=>'numeric', 'len'=>5)
// 默认的字段类型是 text,这里将类型定义成 numeric
)
)
);

这里我们有两张表:用户和帖子。

用户有姓名,有些用户发帖子而有些用户关注帖子。帖子有文本内容,浏览量以及关注者。

用户还有其他许多用户作为好友。

使用这个模型,我们想通过 $user[‘posts’] 获取用户发布的所有帖子,通过 $post[‘writer’] 获取帖子的作者。这是一对多关系。

我们还想通过 $user[‘liked_posts’] 获取用户关注过的帖子,通过 $post[‘likers’] 获取帖子的关注者。这是多对多关系。

最后我们想通过 $user[‘friends’] 获取用户的好友列表。这是自引用关系。

定义 MySQL 连接方式

定义 MySQL 连接方式也写成一个像这样的数组:

复制代码
$db_config=array(
'hostname'=>'localhost', 'database'=>'social',
'username'=>'root', 'password'=>''
);

定义缓存配置

目前,我们有三种缓存类型实现:APC、Memcached 以及普通文本文件。 要使用 APC,这样的配置数组就够了:

复制代码
$cache_config=array('type'=>'apc');

要使用 Memcached,你需要提供一些参数:

复制代码
$cache_config=array('type'=>'memcached', 'host'=>'127.0.0.1',
'port'=>11211, 'timeout'=>1);

要使用普通文本文件,你需要创建一个可读可写的目录并提供其绝对路径:

复制代码
$cache_config=array('type'=>'file', 'path'=>'/tmp/my_project_cache')

还有一个可选参数“prefix”。如果给定,它将用作缓存的键名。

开始使用

现在是时候使用那些我们定义过的数据了。初始化该库,我们只需要这几行代码。

复制代码
DB::init($db_config);
CACHE::init($cache_config);
ADB::init($model);
$adb=ADB::get_instance();

创建表

这项任务只需执行一次。我们告诉库去创建所需的数据库表。它就会负责完成关系等相关的复杂工作。

复制代码
$adb->create_tables();

我们只需在发布的时候执行该方法一次。如果在插入数据之后,调用该方法将导致数据丢失。

使用记录

我们手头拥有这个 $adb 实例。我们将通过它来获取所有数据。

创建记录

我们提供表名和由字段名称及数据组成的键值对数组来创建一条记录。

复制代码
$uid1=$adb->create('user', array('name'=>'John'));
$uid2=$adb->create('user', array('name'=>'Marry'));
$pid1=$adb->create('post', array(
'writer'=>$uid1,
'text'=>'What a wonderful world!'
));
$pid2=$adb->create('post', array(
'writer'=>$uid2,
'text'=>'Life is beautiful!'
));

创建多对多关系

第一个参数是表名。第二个参数是被关联记录的局部名称。第三个参数是记录的 ID,第三个参数是被关联记录的 ID。

复制代码
$adb->relate('user', 'friends', $uid1, $uid2);
$adb->relate('user', 'liked_posts', $uid1, $pid1); // 关注自己的帖子 :)
$adb->relate('user', 'liked_posts', $uid1, $pid2);
$adb->relate('user', 'liked_posts', $uid2, $pid1);

列举数据

我们可在一个简单的循环中列举所有写过帖子的用户以及帖子的关注者:

复制代码
foreach ($adb->id_list('user') as $uid) {
// load user
$user=$adb->load('user', $uid);
echo '<h1>' . $user['name'] . '</h1>' . "\n";
echo '<h2>Posts: </h2>' . "\n";
echo '<ul>' . "\n";
foreach ($user['posts'] as $pid) {
//load post of user
$post=$adb->load('post', $pid);
$likers=array();
foreach ($post['likers'] as $lid) {
// load liker of post
$liker=$adb->load('user', $lid);
$likers[]=$liker['name'];
}
$likers=(count($likers)) ? '<br />' . implode(', ',
$likers) . ' liked.' : '';
echo '<li>' . $post['text'] . ' ' . $likers . '</li>' .
"\n";
}
echo '</ul>' . "\n";
}

更新记录

我们能够像下面这样更新任意一个记录:

复制代码
$user1=$adb->load('user', $uid1);
$user1['name']='Jack';
// 无需调用任何保存方法,保存以及缓存的同步更新全是自动的。

如果我们需要一次更新多个字段,这是另一种方法:

复制代码
$post1=$adb->load('post', $pid1);
$post1->update(array('writer'=>$uid2, 'text'=>'Not a wonderful
world!'));

删除关联

这和创建关联一样:

复制代码
$adb->unrelate('user', 'friends', $uid1, $uid2);
$adb->unrelate('user', 'liked_posts', $uid1, $pid1);

删除记录

我们可以删除记录,同时保存或删除与该记录相关联的数据。

复制代码
$adb->delete('user', $uid1);
// 用户删掉了,帖子成为匿名的了。
$adb->delete('user', $uid1, true);
// 用户以及用户的帖子都删掉了。

查询更多

作为示例,我想获得最受关注的 5 篇帖子。如下是我们所有要做的:

复制代码
foreach ($adb->id_list('post', false, 'likers DESC', 5) as $pid) {
$post=$adb->load('post', $pid);
// 可对帖子做任何操作
}

抑或是我们想要获取用户被关注次数超过 5 次的所有帖子,我们可以执行以下操作:

复制代码
$user=$adb->load('user', $uid1);
foreach ($user->id_list('post', 'view_count>5') as $pid) {
$post=$adb->load('post', $pid);
// 可对帖子做任何操作
}

主要目标

对于单独的帖子页面,我们的代码将会是这么简单:

复制代码
$post=$adb->load('post', $pid1);
$writer=$adb->load('user', $post['writer']);
echo $writer['name'] . ' wrote' . "<br />\n";
echo $post['text'] . "<br />\n";
$post['view_count']++;
// 是的,增大浏览量就是这么简单

这些代码里有任何查询或者缓存逻辑吗?没有,主要目标是保持简单。

市面上有很多著名的替代产品。他们文档完备,支持得也更好。该库不是他们中的一员,它目前还不是一部状态良好的机器。在我看来,这是最简单且容易上手的方法。如果 ORM 库的目的是为了让编码人员不用关心数据库逻辑,这个库是其他新兴库中最自信的一个。jQuery 是最简单的 javascript 框架,也因此成了标准。所以,易于使用的 PHP ORM 库也有这样的机会。

这个库的下载地址:[ arrayDB github ]

欢迎提出意见和建议。

关于作者

Mustafa Dokumaci 是一位来自土耳其伊斯坦布尔的软件工程师。他的专业是环境工程和会计学,但他目前就职于 sporcum.com 和 hipsin.com。Mustafa 拥有六年的 PHP、MySQL、Apache、Nginx、Python、CodeIgniter、Magento 等的使用经验。

查看英文原文 arrayDB, a New and Easy PHP ORM


感谢侯伯薇对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2012-10-26 04:366001
用户头像

发布了 27 篇内容, 共 77466 次阅读, 收获喜欢 4 次。

关注

评论

发布
暂无评论
发现更多内容

逻辑多租场景下,故障爆炸半径的控制实践

华为云开发者联盟

开发 华为云 华为云开发者联盟

科普:多领域分布式协同仿真

DevOps和数字孪生

协同仿真

字节跳动 Spark Shuffle 大规模云原生化演进实践

字节跳动云原生计算

大数据 spark 云原生

身为程序员,这几款工具老少皆宜

高端章鱼哥

持续集成 单元测试 开发工具

「大模型摇摇乐」狂欢落幕!盘点那些让你意想不到的应用集锦

飞桨PaddlePaddle

开发者 大模型 AI应用 文心一言

一行代码修复100vh bug

快乐非自愿限量之名

CSS 前端 代码

Fine-tuning: 深度解析P-tuning v2在大模型上的应用

百度开发者中心

深度学习 nlp 大模型

先进制造身份治理现状洞察:从手动运维迈向自动化身份治理时代

Authing

制造业 先进制造 国产化替代 身份自动化

分享一些很优秀的URL设计

伤感汤姆布利柏

数据库系列:业内主流MySQL数据中间件梳理

不在线第一只蜗牛

MySQL 数据库 数据

大模型高效微调技术

百度开发者中心

人工智能 深度学习 大模型

身份管理如何提升中小企业生产力?

Authing

企业管理 中小企业 Authing 身份管理

【第七在线】季节性商品计划:如何应对时尚行业的快速变化

第七在线

Axure RP 9 for Mac(交互式产品原型设计工具) v9.0.0.3682永久激活版

mac

Axure RP 9 苹果mac Windows软件 产品原型设计软件

大模型微调方法总结:LoRA、Adapter、Prefix-tuning、P-tuning、Prompt-tuning

百度开发者中心

人工智能 深度学习 大模型

通过解析封装关键词搜索速卖通商品列表数据接口,速卖通API接口

tbapi

速卖通API接口 速卖通商品数据接口 关键词搜索速卖通接口 速卖通商品列表数据接口 速卖通商品列表接口

长三角安防行业盛会“2024杭州国际安防产品展览会”

AIOTE智博会

安防展 杭州安防展 安防产品展

云技术分享 | 使用快照和 AMI 镜像进行 Amazon EC2 的备份和恢复

亚马逊云科技 (Amazon Web Services)

Amazon EC2 Amazon S3 amazon-ebs backup

低代码:万事俱备,就差一个程序员

互联网工科生

软件开发 低代码 JNPF

胡润研究院首次发布“全球猎豹企业榜”,涛思数据榜上有名

TDengine

涛思数据 tdengine 时序数据库

BRC-20铭文代币合约质押挖矿系统开发丨详情开发

l8l259l3365

2023开放原子开发者大会全日程

开放原子开源基金会

开源

GM EPUB Reader Pro for mac(电子书阅读器)v2.6.0免激活版

iMac小白

低代码平台表单引擎设计器

这我可不懂

低代码 表单设计

每日一题:LeetCode-162. 寻找峰值

半亩房顶

Go 算法 LeetCode 分治 搜索

从聚水潭开始,自动化您的电商工作流程

RestCloud

零代码 CRM APPlink 聚水潭

Cloudeye对接Prometheus实现华为云全方位监控

华为云开发者联盟

云计算 华为云 华为云开发者联盟 华为云弹性云服务器

铸就安全可信的数字化「信息枢纽」—华为云ROMA Connect荣膺软件产品可信【卓越级】认证

华为云PaaS服务小智

云计算 华为云

诚邀报名|探索汽车智能化的开源未来

开放原子开源基金会

开源

大数据,领导者阵营!

腾讯云大数据

大数据

速抢早鸟票|阿里云PolarDB开发者大会,高能来袭

阿里云瑶池数据库

阿里云 开发者大会 阿里云瑶池数据库 阿里云PolarDB

arrayDB,全新而且简单的PHP ORM库_PHP_Mustafa Dokumacı_InfoQ精选文章