在上一篇博客中,我们抽象出了Controller的基类,实现了页面的渲染和返回JSON字符串的功能。

那作为一个框架,我们现在还缺少什么?是的,大家应该已经注意到了,我们在这之前从来没有连接过数据库,我们缺少一个ORM(Object Relational Mapping)。

在php中连接mysql有三种方式,分别是使用原生函数、mysqli扩展和PDO扩展,详细内容可以查看我之前的博客《PHP的学习--连接MySQL的三种方式》。

我们要选择哪一种呢?考虑到作为一个框架不能仅支持一种数据库,我们就选择使用PDO。当然如果你确定你的框架只需要连接mysql数据库,也可以考虑使用mysqli。

PDO支持如下的数据库:

当然,这些数据库即使都可以使用PDO去连接使用,但在某些具体的情况下,还是有些许不同的,详情可参考PDO文档

鉴于我电脑现在只安装了mysql,之后的code,只会测试mysql数据库,不会测试其他数据库。

首先我们会将这些内容放在src/db文件夹中,我们需要定义一下接口,这里我们会先安最简单的来。

我们需要实现什么?最简单的就是数据的增删改查。

假设我们现在有一张article表,一个与之对应的Model Article,我们希望怎么用它呢?

// 选出id为1的一篇文章
$article = Article::findOne(['id' => 1]); // 选出status是unpublished的所有文章
$articles = Article::findAll(['status' => 'unpublished']); // 将id为1的所有文章的status更新为published
Article::updateAll(['id' => 2], ['status' => 'published']); // 删除所有id为1的文章
Article::deleteAll(['id' => 2]); // $article是之前选出的id为1的文章
// 更新它的属性status为unpublished
$article->status = 'unpublished';
// 保存更新到数据库
$article->update(); // 删除该文章
$article->delete(); // 创建一个新文章
$article = new Article();
$article->name = 'My first article';
$article->status = 'published';
// 将该文章保存到数据库中
$article->insert();

大概在上面列了一下,我们简单的ORM实现之后的使用,据此我们可以定义出如下接口:

<?php
namespace sf\db; interface ModelInterface
{
public static function tableName(); public static function primaryKey(); public static function findOne($condition); public static function findAll($condition); public static function updateAll($condition, $attributes); public static function deleteAll($condition); public function insert(); public function update(); public function delete();
}

该文件放在src/db文件夹下,这是我目前想到的最简单的接口,可能会有所遗漏,我们会在开发的时候不断完善。暂时我们会先按照这个实现。

这是一个接口,之后我们会有一个Model类实现这个接口,然后所有的Model都继承这个Model类去实现。

好了,今天就先到这里。项目内容和博客内容也都会放到Github上,欢迎大家提建议。

code:https://github.com/CraryPrimitiveMan/simple-framework/tree/0.4

blog project:https://github.com/CraryPrimitiveMan/create-your-own-php-framework

构建自己的PHP框架--定义ORM的接口的更多相关文章

  1. 构建自己的PHP框架(ORM)

    完整项目地址:https://github.com/Evai/Aier 我们选择 Laravel 的 illuminate/database 作为我们的 ORM 包. 在本系列教程里,每一个 Comp ...

  2. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

  3. 如何构建Android MVVM 应用框架

    概述 说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架.然而两者的概念是不一样的,不能混为一谈.MVVM是一种架构模式,而DataBinding是 ...

  4. net 和Mono 构建的HTTP服务框架

    Nancy是一个基于.net 和Mono 构建的HTTP服务框架,是一个非常轻量级的web框架. 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATC ...

  5. 构建Java并发模型框架

    Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误.另外,应用逻辑和线程逻辑纠 ...

  6. Django框架 之 ORM查询操作详解

    Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...

  7. 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...

    原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...

  8. beego框架之orm模块——mysql

    参考beego原文:http://beego.me/docs/mvc/model/orm.md#main.go beego ORM 是一个强大的 Go 语言 ORM 框架,orm模块主要是处理MVC中 ...

  9. Django框架05 /orm单表操作

    Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...

随机推荐

  1. jsfl脚本设置导出AS链接名遇到的奇怪问题

    今天写jsfl脚本发现一个奇怪的问题,脚本用于对库对象设置AS链接名,代码如下: var item = fl.getDocumentDOM().library.items[0];var exportN ...

  2. IntelliJ添加Emacs编辑器

    Intellij只支持emacs as a external tool: https://www.jetbrains.com/help/idea/2016.2/tutorial-using-emacs ...

  3. win 8 换 win7 注意事项

    win8 换win7 硬盘格式修改一下gpt 格式转换为mbr模式 当进入到要选择安装到某一个盘时,由于磁盘的类型不同,会提示:“选中的磁盘采用GPT分区形式无法安装系统”.这时需要重新设置分区形式( ...

  4. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  5. 性能计数器与profiler的组合性能诊断

    性能计数器和sql profiler都是常用的性能诊断工具和优化工具,最近和群友聊天发现很多人竟然不知道这两个可以“组合”使用,所以这篇算是一篇扫盲贴吧. 两种工具简述 通过计数器可以收集两部分内容: ...

  6. 探索c#之不可变数据类型

    阅读目录: 不可变对象 自定义不可变集合 Net提供的不可变集合 不可变优点 不可变对象缺点 不可变对象 不可变(immutable): 即对象一旦被创建初始化后,它们的值就不能被改变,之后的每次改变 ...

  7. 招聘.NET开发人员(截止于2015-06-15)

    文章更新 2015-06-15 01:00AM: 感谢各位的支持,简历和解决方案接收截止.2015-06-08 08:30AM: 已经收到一些简历和解决方案,正在筛选中.职位仍然开放,欢迎发送简历及解 ...

  8. JavaScript实现TwoQueues缓存模型

    本文所指TwoQueues缓存模型,是说数据在内存中的缓存模型. 无论何种语言,都可能需要把一部分数据放在内存中,避免重复运算.读取.最常见的场景就是JQuery选择器,有些Dom元素的选取是非常耗时 ...

  9. LInux 查看环境变量

    1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ ech ...

  10. C#事件

    事件(event),这个词儿对于初学者来说,往往总是显得有些神秘,不易弄懂.而这些东西却往往又是编程中常用且非常重要的东西.大家都知道windows消息处理机制的重要,其实C#事件就是基于window ...