构建自己的PHP框架--定义ORM的接口
在上一篇博客中,我们抽象出了Controller的基类,实现了页面的渲染和返回JSON字符串的功能。
那作为一个框架,我们现在还缺少什么?是的,大家应该已经注意到了,我们在这之前从来没有连接过数据库,我们缺少一个ORM(Object Relational Mapping)。
在php中连接mysql有三种方式,分别是使用原生函数、mysqli扩展和PDO扩展,详细内容可以查看我之前的博客《PHP的学习--连接MySQL的三种方式》。
我们要选择哪一种呢?考虑到作为一个框架不能仅支持一种数据库,我们就选择使用PDO。当然如果你确定你的框架只需要连接mysql数据库,也可以考虑使用mysqli。
PDO支持如下的数据库:
- CUBRID (PDO)
- MS SQL Server (PDO)
- Firebird (PDO)
- IBM (PDO)
- Informix (PDO)
- MySQL (PDO)
- MS SQL Server (PDO)
- Oracle (PDO)
- ODBC and DB2 (PDO)
- PostgreSQL (PDO)
- SQLite (PDO)
- 4D (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的接口的更多相关文章
- 构建自己的PHP框架(ORM)
完整项目地址:https://github.com/Evai/Aier 我们选择 Laravel 的 illuminate/database 作为我们的 ORM 包. 在本系列教程里,每一个 Comp ...
- Django框架06 /orm多表操作
Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...
- 如何构建Android MVVM 应用框架
概述 说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架.然而两者的概念是不一样的,不能混为一谈.MVVM是一种架构模式,而DataBinding是 ...
- net 和Mono 构建的HTTP服务框架
Nancy是一个基于.net 和Mono 构建的HTTP服务框架,是一个非常轻量级的web框架. 设计用于处理 DELETE, GET, HEAD, OPTIONS, POST, PUT 和 PATC ...
- 构建Java并发模型框架
Java的多线程特性为构建高性能的应用提供了极大的方便,但是也带来了不少的麻烦.线程间同步.数据一致性等烦琐的问题需要细心的考虑,一不小心就会出现一些微妙的,难以调试的错误.另外,应用逻辑和线程逻辑纠 ...
- Django框架 之 ORM查询操作详解
Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...
- 手把手0基础项目实战(一)——教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)...
原文:手把手0基础项目实战(一)--教你搭建一套可自动化构建的微服务框架(SpringBoot+Dubbo+Docker+Jenkins)... 本文你将学到什么? 本文将以原理+实战的方式,首先对& ...
- beego框架之orm模块——mysql
参考beego原文:http://beego.me/docs/mvc/model/orm.md#main.go beego ORM 是一个强大的 Go 语言 ORM 框架,orm模块主要是处理MVC中 ...
- Django框架05 /orm单表操作
Django框架05 /orm单表操作 目录 Django框架05 /orm单表操作 1. orm使用流程 2. orm字段 3. orm参数 4. orm单表简单增/删/改 5. orm单表查询 5 ...
随机推荐
- iOS地图
地图 1.主要用到了地图展示和定位功能 CoreLocation框架的使用: 导入头文件 #import <CoreLocation/CoreLocation.h>CoreL ...
- 最长下降子序列O(n^2)及O(n*log(n))解法
求最长下降子序列和LIS基本思路是完全一样的,都是很经典的DP题目. 问题大都类似于 有一个序列 a1,a2,a3...ak..an,求其最长下降子序列(或者求其最长不下降子序列)的长度. 以最长下降 ...
- socket通信
socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...
- .保护Express应用程序
毫无疑问,Node.js已经变的愈加成熟,尽管这样,开发者仍然缺乏大量的安全指南.在这篇文章中,我将分享一些有关Node.js安全要点给大家,希望大家能够谨记于心. 1.避免使用Eval Eval并不 ...
- final 140字评论
按照演讲顺序 1.约跑app 个人感觉约跑现在做的已经很不错了,要是能添加地图就更好了. 2.礼物挑选 给人感觉在一定的时间做到这个程度,很不错很好,讲的声音有点小. ...
- 用Unity实现时间倒退效果
记得以前看过一个电影,叫做<独立游戏大电影>,其中有个一个游戏可以实现时间回退的功能,可以像倒带一样,十分有趣.因此我就想着用Unity也实现一个类似的简单Demo,说不定哪天会用到. 效 ...
- XMLHTTPRequest对象的创建与浏览器的兼容问题
MLHttpRequest 对象是AJAX功能的核心,要开发AJAX程序必须从了解XMLHttpRequest 对象开始. 了解XMLHttpRequest 对象就先从创建XMLHttpRequest ...
- 如何让Maple中的数学引擎进入你的桌面应用程序和网站
MapleNET数学服务套件将Maple 2015强大的数学引擎引入您的应用程序和网站.使用MapleNET,您可以添加数学计算和可视化功能到网页和桌面程序中,通过互联网/局域网分享“活”的Maple ...
- c = (a / b, a%b) 运算输出顺序
#include<iostream> int main() { using namespace std; int a, b, c; a = ; b = ; c = ; printf(&qu ...
- 什么是jquery $ jQuery对象和DOM对象 和一些选择器
1什么是jQuery: jQuery就是将一些方法封装在一个js文件中.就是个js库 我们学习这些方法. 2为什么要学习jQuery: 原生js有以下问题: 1.兼容性问题2.代码重复3.DOM提供的 ...