资讯专栏INFORMATION COLUMN

micro activerecord library in PHP(一个微型的PHP实现的AR库)

i_garfileo / 1002人阅读

摘要:一个微型的实现的库体积很小带详尽的注释总共只有行支持链式调用支持关系前言最开始接触是在学习的时候,那个时候觉得用操作数据库真的是太方便了。但是已经算是一个小型的库了。同样的还提供了简写的以及,等接口函数。

一个微型的PHP实现的AR库

体积很小带详尽的注释总共只有400行
支持链式调用
支持关系

前言

最开始接触ActiveRecord是在学习Yii的时候,那个时候觉得用AR操作数据库真的是太方便了。以至于后来转向其他的一些框架的时候,感觉没有了AR似乎就不能操作数据库了一样!!!特别是中间自己使用一些简单的说不上框架的东西来写微型的PHP站点的时候,感觉手写SQL太难看。
后来也接触过一些优秀的独立的ORM的库,比如我最喜欢的idiorm. 甚至曾经萌生了想要把Yii的AR多带带拿出来用的想法!但是后来还是没有实现。。。
在13年的时候,有一段时间上班时间太清闲,所以当时就想自己实现一个ActiveRecord类,一来打算练练手,而来也打算自己以后用的上。

准备

在开始动手写之前,在github,以及stackoverflow上面寻找了一大堆的php的AR库或者ORM的库。

https://github.com/j4mie/idiorm

https://github.com/vrana/notorm

https://github.com/PrimalPHP/Record

https://github.com/spadgos/Record

https://github.com/sgoen/php.pdo.orm

https://github.com/jaceju/example-my-orm

当然其中最好的就是idiorm以及notorm,在github上门分别有1600+和600+的star。
拿idiorm来说,个人非常喜欢它提供的接口以及使用方式。而且整个库也就单个文件,虽然文件将近2500行。但是已经算是一个小型的库了。当然文件有点长,看起来有点费劲。
相对而言notorm设计得更加OO一些。不过在其中的NotORM_Result这个class中明显看到一大片字符串拼接SQL的方式,还是让人觉得看起来不是很好。

设计

在看了一堆这样的ORM的库之后,非常反感那种直接拼接SQL的方式,但是这又是一个无法避开的问题,最后总是需要生成一个SQL字符串的。
关键在于需要找出一种比较”优雅“的方式来完成这个拼接的工作。

表达式

有一天在看拼接的SQL的时候偶然间感觉SQL里面where后面的那些查询条件总是一个一个的表达式(一个操作数加上一个操作符再加上一个操作数,例如:name="demo" and email="demo@demo.com")。

这个表达式的结构看起来和数学里面的(1+1)*(2+2)是那么的相像。

甚至连and,or也是一个一个的操作符而已。再提炼一下除了二元表达式,还有一元表达式(只有一个操作数的表达式,类似数学里面的-1)。这样算起来SQL里面的select,from,where,delete,update这样的关键词都可以算成是”操作符“了。

那么一个简单的SQL就可以分解成一个一个的表达式:

select email, password from `user` where email = "demo@demo.com";

select email, password

from user

where email = "demo@demo.com"

email = "demo@demo.com"

上面的SQL总共拆分出来了4个表达式,其中where部分是嵌套的一个表达式。

实现 Expressions

所以,我专门定义了一个Expressions类用来表示SQL中的各个部分。这个类只有一个__toString方法在最后需要的时候生成SQL

class Expressions extends Base {
    public function __toString() {
        return $this->source. " ". $this->operator. " ". $this->target;
    }
}

当然还有比较特殊的表达式就是"()",这个表达式特殊在于操作符是分开的。

接口

当提炼出来了表达式的类之后,那么在使用ActiveRecord查询数据库的时候,每输入一个动词,都只是在适当的地方插入一个表达式而已。只有在最后的时候才会一次性的调用每一个表达式的__toString方法组合SQL,为了安全考虑,使用了PDO的绑定参数的形式防止SQL注入的风险!
比如:

$user->equal("id", 1);
只是在where子句里面生成了一个 "id=:ph1"的表达式,同时保存了一个array(":ph1"=>1)的参数而已。同样的还提供了简写的”eq“以及”ne“,”ge“等接口函数。另外还有”select“,”from“,”group“,”order“,”limit“,”top“以及”where“等接口函数。
魔术方法

为了减少代码量,所以这里使用了__call魔术方法避免了为每一个动作都去定义个method。

关系

除了实现SQL的基本操作,还实现了一下类似Yii的ActiveRecord法让Relation的方法可以简单的通过主外键关系查询数据。
定义了”HAS_ONE“,”HAS_MANY“和”BELONGS_TO“三种关系。
可以在定义关系之后,能通过简单的的访问属性的方式获得关联的数据。

项目

项目地址:https://github.com/lloydzhou/activerecord
文档地址:https://lloydzhou.github.io/activerecord
已经提交到packagist.org可以通过composer安装

composer require lloydzhou/activerecord
DEMO

为了一边测试,一边完善这个库。所以使用这个库结合另外一个Router和 MicroTpl 写了一个简单的 博客 ,里面基本涵盖了这几个库的API。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21147.html

相关文章

  • 途牛原创|大话权限中心PHP架构之道

    摘要:权限中心的依赖声明声明依赖关系检查代码规范声明开发依赖命名空间检查代码规范,执行单元测试。单元测试持续交付一切都如此的完美,没有测试,又如何可以证明这件事情的完美,又如何可以保障交付的质量。 序 权限管理是无线运营系统中的核心模块,通过访问控制策略的配置,来约定人与资源的访问关系。 本文着重讲解如何通过PHP来构建一个灵活、通用、安全的权限管理系统。 关于权限 首先我们来聊聊权限。 权...

    miracledan 评论0 收藏0
  • 一个PHP微型路由控制器

    摘要:在这个后面执行用户自定义的,这些是在定义回调函数的时候一起给定当前需要调用的列表。而传统的以正则表达式做映射方式,查找回调函数时间不稳定,最坏情况需要执行一遍所有的正则表达式。 之前使用dispatch, 但是从4.0到现在的8.0 API变动比较大,特别是在最近两次大的版本的升级,为了保持代码简洁丢失了向下兼容的特性。 感觉作者的的核心思想不是很坚定。所以生出了自己造轮子的冲动。 r...

    rollback 评论0 收藏0
  • yii2 ActiveRecord多表关联以及多表关联搜索实现

    摘要:今天把这个问题讲明白了,看看是怎么个多表关联以及如何去优化这个关联。现需要在列表展示表的来源渠道,且该渠道可搜索。关联表字段增加查询中的搜索模型也是通过实现的,该模型通过控制着哪个字段可搜索,哪个字段不可搜索。 作者:白狼 出处:http://www.manks.top/yii2_many_ar_relation_search.html 本文版权归作者,欢迎转载,但未经作者同意必须保留...

    venmos 评论0 收藏0
  • 你不可不知道20个优秀PHP框架

    摘要:每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷安全和有效。官方网站是一款老牌的框架,现在稳定版本已经是了。官方网站是由最大的社区之一的管理开发的,也是一个开源的框架。 对于Web开发者来说,PHP是一款非常强大而又受欢迎的编程语言。世界上很多顶级的网站都是基于PHP开发的。 每一个开发者都知道,拥有一个强大的框架可以让开发工作变得更加快捷、安全和有效。在开发项目之前选...

    zombieda 评论0 收藏0
  • php 学习指南及技术干货

    摘要:安全生成安全的随机数,加密数据,扫描漏洞的库一个兼容标准的过滤器一个生成随机数和字符串的库使用生成随机数的库一个安全库一个纯安全通信库一个简单的键值加密存储库一个结构化的安全层一个试验的面向对象的包装库一个扫描文件安全的库 Security 安全 生成安全的随机数,加密数据,扫描漏洞的库 HTML Purifier-一个兼容标准的HTML过滤器 RandomLib-一个生成随机数和字...

    lifefriend_007 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<