写点什么

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:366204
用户头像

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

关注

评论

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

「聚变」前端 & 客户端 | 第十七届 D2 终端技术大会,来了

阿里巴巴终端技术

阿里巴巴 前端 移动端 客户端 D2

Pytorch、CUDA和cuDNN的安装图文详解win11(解决版本匹配问题)

timerring

PyTorch cuda 10月月更 cudnn

千锋1024程序员节大咖讲师技术直播火力全开

千锋IT教育

MetaForce佛萨奇魔豹2.0系统开发技术讲解方案

I8O28578624

落地DataOps,必须克服的挑战有哪些?

雨果

DataOps

全局图优化:提升 MegEngine 模型推理性能的又一神器

MegEngineBot

深度学习 开源 性能优化 MegEngine 全局图优化

场景金融持续引发行业关注,4.0时代打造金融服务新生态

易观分析

银行 场景金融

浅谈Mixin、Composition API、Reactive API、Ref API以及readonly🔥

渔戈

前端 Vue3 10月月更

基于Delta Lake构建数据湖仓体系

阿里云大数据AI技术

大数据 开源 企业号十月 PK 榜

嵌入式 Linux 入门(六、Shell 脚本编程下:Shell 脚本语法)

矜辰所致

Linux Shell shell脚本编程 10月月更

华为云全球加速GA,助力中小企业突破发展瓶颈!

清欢科技

哪里有便宜的云服务器?可以下月付款吗?

行云管家

云计算 服务器 云服务器

高可用系统哪家靠谱?工作原理是什么?

行云管家

高可用 高可用架构 高可用集群

现代农业|AIRIOT智慧农业管理解决方案

AIRIOT

低代码 物联网 智慧农业

手写现代前端框架diff算法-前端面试进阶

helloworld1024fd

JavaScript

华为云全球加速GA,让企业获得更优质的服务体验

清欢科技

快被Gartner捧上天的Data Fabric数据经纬到底是个啥?

雨果

Data Fabric 数据经纬

华为云全球加速GA,助跨境企业云上业务通达

清欢科技

项目实战:在线报价采购系统(React +SpreadJS+Echarts)

葡萄城技术团队

React 项目实战 采购软件 echart

天翼云推出全栈政务混合云支持私有化运行

天翼云开发者社区

手写JavaScript常见5种设计模式

helloworld1024fd

JavaScript

华为云弹性公网IP服务,为企业敲开互联网大门

清欢科技

凭什么 31x31 大小卷积核的耗时可以和 9x9 卷积差不多?| 文末附 meetup 回顾

MegEngineBot

深度学习 开源 卷积 MegEngine

开启自然资源管理“智绘”之路!

天翼云开发者社区

智慧城市、数字政府、城市大脑、一网统管之间有什么关系

雨果

智慧城市 城市大脑 数字政府 一网统管

永久免费低代码开发平台有哪些?

优秀

低代码 低代码开发平台

【限量招募30人】免费参与SPSS云版本内测

淋雨

SPSS

SAP | 消息 MESSAGE

暮春零贰

SAP 消息 10月月更

基于 MinIO 部署单实例 Databend | 新手篇(1)

Databend

前端二面手写面试题总结

helloworld1024fd

JavaScript

2022年中国篮球内容消费趋势洞察

易观分析

消费 篮球

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