phalapi 多表查询的函数在什么地方写

phalapi-入门篇5(数据库操作和Model层)
phalapi-入门篇5(数据库操作和Model层)
phalapi-入门篇5(数据库操作和Model层)
先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架.
本小节主要讲解基于notorm的数据库操作以及使用Model层进行快速的数据层的开发,请确保装有PDO拓展.
1. 基于PDO的notorm进行的数据库操作
phalapi的数据库操作是使用的开源的notorm进行的,notorm是基于PDO链接数据库,在框架内部默认链接的是mysql数据库,如需修改链接其他数据库请修改 /PhalApi/PhalApi/DB/NotORM.php中的getPdo方法:
$dsn = sprintf('mysql:dbname=%s;host=%s;port=%d',
$dbCfg['name'],
isset($dbCfg['host']) ? $dbCfg['host'] : 'localhost',
isset($dbCfg['port']) ? $dbCfg['port'] : 3306
再讲之前其实这里是有一个坑的,机智的童鞋应该发现了框架自带的user数据库里面有一个以from命名字段,应为在notorm生成sql语句的时候不会给自动自动加上引号 ,所以在修改添加删除有涉及这个字段的时候会报错,所以我们在这里把它改成phone(所以大家要注意字段名不能为关键字)
下面我们正式来讲解如何使用,我们先在Demo/Api下面创建一个DB.php文件作为我们的DB模块,
* 数据库接口服务类
class Api_DB extends PhalApi_Api{
public function getRules(){
return array(
'insert' =& array(
=& array('name' =& 'id', 'require' =& true, 'desc' =& '用户Id'),
=& array('name' =& 'name', 'require' =& true, 'desc' =& '用户名称'),
'phone' =& array('name' =& 'phone', 'require' =& true, 'desc' =& '用户手机号码'),
'select' =& array(
'id' =& array('name' =& 'id', 'require' =& true, 'desc' =& '用户Id'),
'update' =& array(
=& array('name' =& 'id', 'require' =& true, 'desc' =& '用户Id'),
=& array('name' =& 'name', 'require' =& true, 'desc' =& '用户名称'),
'phone' =& array('name' =& 'phone', 'require' =& true, 'desc' =& '用户手机号码'),
'delete' =& array(
'id' =& array('name' =& 'id', 'require' =& true, 'desc' =& '用户Id'),
一共是增删改查四个接口代表四种操作(这里一定要配置好数据库,以及运行框架自带的sql文件phalapi_test.sql)
1.1 insert接口
我们先写增加接口如下:
* 新增表服务
* @return int id 新增列的Id
public function insert(){
$data = array(
//用数组构成需要插入键值一一对应
=& $this-&id,
=& $this-&name,
'phone' =& $this-&phone,
= DI()-&notorm-&user-&insert($data);
//执行数据库操作user代表的是表,返回结果是插入成功的值
return $rs['id'];
//返回插入的id
重要的是 $rs
= DI()-&notorm-&user-&insert($data); 这段代码执行了sql语句,user是表名(这里的表名会加下在dbs中配置的表前缀组成一个完整的表名)我们试着运行一下会得到以下结果
1.2 select接口
查询接口如下:
* @return array data 结果集
public function select(){
= array();
$data[] = DI()-&notorm-&user-&select('name,phone')-&where('id', $this-&id)-&fetch();
$data[] = DI()-&notorm-&user-&select('name,phone')-&where('id = ?', $this-&id)-&fetchAll();
$data[] = DI()-&notorm-&user-&select('name,phone')-&where('id != ?', $this-&id)-&fetchRows();
执行会得到以下结果
为什么会有这样的区别,通过下面的一些小提示大家就能看到区别在哪里:
1.2.1 select方法
select方法主要是用来指定返回值,接受的是一个string他的作用于真正查询语句select和from之间填充,大家如果把select('name,phone') 改为 select('*') 就会得到包括id的所有字段的返回
1.2.2 where方法和排序
where方法是查询中的重要的一个环节
where('id', $this-&id)等同于where('id = ?', $this-&id)
where('id != ?', $this-&id)这种方式只要是为了指定条件大于,等于,小于,不等于等
当然如果是需要有多个条件就使用连续的where就可以-&where('id != ?',1)-&where('phone','')这种形式
关于排序的使用其实和where差不多使用-&order('字段名')如果要反排序在字段名后面加上DESC
1.2.3 fetch,fetchAll和fetchRows
大家有看到上面执行的三条查询语句后面的结束放到都不同这里讲解一下他们的区别和怎么用他们使用单独去执行sql语句
fetch方法是获取单独的一条数据返回结果是不带下标的数组 ,fetchAll和fetchRows不同在于他们返回的是包含多条数据一个带下标的数组,可以看到在条件一样的情况下第一条和第二条查询出来的结果区别是第二条多了一个0的下标,从此可得到如果是确定返回结果只有一条优先使用fetch,如果是多条结果优先使用fetchAll和fetchRows.
fetchAll和fetchRows还提供了一个功能就是单独执行sql语句
$sql = 'select * from tbl_user where id = :id';
$params = array(':id' =& $this-&id);
//替换:id为请求参数的id
DI()-&notorm-&user-&queryAll($sql, $params);
//或fetchRows($sql, $params)
这样就可以执行sql语句,包括一些复杂的查询sql可以使用此内方法执行(关联查询应当优先使用这种形式)
1.3 update接口
修改接口如下:
public function update(){
$data = array(
=& $this-&name,
'phone' =& $this-&phone,
= DI()-&notorm-&user-&where('id', $this-&id)-&update($data);
if($rs === false){
throw new PhalApi_Exception_BadRequest('修改数据失败');
大家可以试一试执行之后是否有修改数据库
使用其实和添加接口差不多只是一个是吧id作为值,一个是作为条件
比较值得讲一下的是为什么使用if($rs === false)
原因是这样的,这里执行update方法之后获取得是影响行数,如果原本值就是一样的那就回返回0,只有在真正语句失败的时候会返回false所以这里使用全等于false作为判断是否执行成功的条件
1.4 delete接口
删除接口如下:
public function delete(){
= DI()-&notorm-&user-&where('id', $this-&id)-&delete();
if($rs === false){
throw new PhalApi_Exception_BadRequest('删除数据失败');
删除的操作也很简单,不过if($rs === false)就算没有删除到数据也会返回成功,只有当语句失败会反悔false,如果需要未删除到数据提示出错的同学可以把等号减少一个
1.5 打印sql语句
有的时候光靠自己去看代码很难确定是不是哪里写的有问题,但是如果查看生成出来的sql语句就能很快的确定问题出现在哪里
大家可以试试在请求参数中加上 就可以打印出来生成的sql语句方便调试
包括执行时间和先后顺序也一同打印出来了,也可以帮助大家找到慢查询在哪里
2. 使用Model进行数据库操作
使用Model操作是为了提高开发效率,让同样数据库操作可以进行高度的复用,也便于修改起来改一处则全改这种效果
2.1 传统的Model操作
所谓传统的Model操作也就是把数据操作封装起来,方便调用比如/Model/User.php下面的getByUserId方法
public function getByUserId($userId) {
return DI()-&notorm-&user-&select('*')-&where('id = ?', $userId)-&fetch();
在内部直接封装数据库操作使用如下代码调用
$model = new Model_User();
$rs = $model-&getByUserId($userId);
2.2 框架自带的Model操作
当然这里介绍model的目的当然是解读一下phalapi内部提供的model操作
使用自带model操作只需要继承PhalApi_Model_NotORM 在实现如下方法
protected function getTableName($id) {
return 'user';
这个方法主要作用是为了添加这个model 的表名,其实这两个操作在/Model/User.php中已经实现了,我们来重构一下getByUserId方法如下
public function getByUserId($userId) {
return $this-&getORM()-&select('*')-&where('id = ?', $userId)-&fetch();
$this-&getORM()相当于DI()-&notorm-&(getTableName中设置的表名)
然后我们重写select接口如下:
public function select(){
$model = new Model_User();
return $model-&getByUserId($this-&id);
可以获得以下结果
在这里phalapi自带的model和传统的model对比起来区别在于,phalapi统一制定表名不会应为方法果断导致的表名写错的失误
另一方面phalapi自带的model提供了很多字基础操作,利用自动提示功能可以看到
我们来再次改造一下selete接口使用model自带的方法
public function select(){
$model = new Model_User();
return $model-&get($this-&id);
执行结果和上面是一样的,这里注意一点这里Id的名字是dbs中配置的'key' =& 'id',要和数据库中的ID字段名对应,但是这样会有一些问题会在后面进阶篇提及到
在本小节着重讲了CURD操作,以及其中的一些操作的使用和怎么使用phalapi的model层,希望大家看完本小节之后进行一些练习来熟练的掌握使用phalapi对数据库的操作,关于数据库操作的一些小技巧会单独在进阶篇中抽出一小节来讲讲在实际项目开发中遇到的问题以及如何解决,希望大家进一步关注!
注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!
相关标签:
分享即可 +1积分
请登录后,发表评论
评论(Enter+Ctrl)
评论加载中...
评论加载中...
PHP开发工程师
接口,从简单开始
作者的热门手记
Copyright (C)
All Rights Reserved | 京ICP备 号-2phalapi-入门篇1(简单介绍以及环境搭建)
phalapi-入门篇1(简单介绍以及环境搭建) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架。 在进行项目接口的开发过程中,笔者在寻找一个方便针对API开发的框架时,发现了PhalApi。经过了短时间的尝试,发现PhalApi确实
phalapi-入门篇1(简单介绍以及环境搭建)
先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架。
在进行项目接口的开发过程中,笔者在寻找一个方便针对API开发的框架时,发现了PhalApi。经过了短时间的尝试,发现PhalApi确实很便捷,效率很高。
之后就把PhalApi运用到正式的项目上。而且在后面的项目仍一直使用。其间,也和很多希望了解PhalApi框架的朋友做过很多交流。为此,决定写一篇关于这个框架的教程。一方面是为了帮助一些初学者能够快速地了解PhalApi,另一方面是希望把自己在实际运用中总结出的一些小技巧分享出来。
喵了个咪的博客:
开源中国Git地址:
1. 简单的介绍
官网上面有一句话让我特别有感受--接口,从简单开始!
怎样的感受呢,在最近进行一个项目开发的时候,因为项目比较紧急需要快速地开发。从确定完需求以及接口之后,借助PhalApi,我仅用了8个小时就完成项目接口的开发。整个项目的接口差不多20来个,从这点可以看出,如果PhalApi框架用得熟练的话,效率将会提高更多。
其实,接口最关心的就是性能。通过测试下来,Phalapi消耗相对比较小,引入文件在10个左右,空框架返回2核2G并发点击数在1700左右。很是给力。在2核2G正常请求数据库接口相对于一套完整的业务。平均下来最快的1000并发,最慢的600并发。所以我觉得性能方面,PhalApi完全没有问题(压力测试使用的是Loadrunner,ab压力基本是Loadrunner的3倍不太清楚为什么)。
勿忘初心,方得始终
虽然现在这个社会的节奏很快,但如果有时间时,我们不妨静下来,稍微地思考一下,然后你会发现:慢慢来,比较快。
PhalApi 的初衷:
我们之所以开源这个框架,是因为我们想致力于提供可以快速进行开发后台接口的框架,并且通过这个框架分享更多开发的最佳实践、原则和模式!这就是我们的初心,也希望我们能一直坚持下去。
PhalApi命名的来源
得益于开源社区,现在有很多优秀的开源框架。确实有很多框架值得我们去学习和使用,其中高性能的Phalcon框架和可视化代码评审工具Phabricator都是相当令人敬佩和认可的。前者在思想、模式和原则上有很好的文档说明;后者在包管理、命名写法等都非常好地体现了代码重用。受此两个框架的影响,故取名为:PhalApi。
通过PhalApi,我们希望可以
支撑轻量级项目后台接口的快速开发;阐明如何进行框架设计、对应复杂领域业务、支撑海量服务等,以及分享好的思想、技巧工具和最佳实践。最后,争取成为国内主流的PHP接口开发框架。
2. 环境搭建
在这里推荐使用(我后面的配置等都会基于以下环境)lnmp:
Liunx+Nginx+php5.4以上+mysql
我使用的是centos6.5
有三种方式配置环境:
1.手动编译安装(网上资料也挺多的,但是容易出现一些依赖性的问题,新手不推荐。)。
2.yum或apt-get安装(yum安装无法指定目录,都会装到/etc下面去,不方便管理,但是要玩liunx必须要会。)。
3.lnmp一键安装工具(推荐:但是这个推荐是基于上面几种方式都尝试过的情况下,这个安装方式基于--编译安装。)。
我推荐一个lnmp一键配置软件:
官网:OneinStack C 一键PHP/JAVA安装工具:
因为官网介绍得比较详细,在这里就不再多做说明。其余几种方式教程都比较多也不做说明。
那不了解liunx怎么办?wampserver在windows下还是比较好用的。
最后,希望大家在通读PhalApi官方文档后,再接着看下面的文章,会更容易理解。在这一套教程中,我会以构建一个完整的项目为基础,拓展开来讲解一些框架的机制。大家可以跟着一起做,相信能够收获得更多。
注:笔者能力有限,有说的不对的地方,希望大家能够指出。也希望多多交流!
官网QQ交流群:
欢迎大家的加入!
(责任编辑:admin)
------分隔线----------------------------
各位朋友,下面的相关文章可能对您很有帮助!
回想自己刚开始做电源学习阶段,Buck、Boost、Flyback、半桥、移相全桥、LLC一大堆。 ...
AfterEffect在《阿凡达》中的应用 : 《阿凡达》在制作初期,通过将分镜头的概念插图...
首先.想要玩AE 你需要一个控制器.可以输入BC.IC能量.当有能量的时候你就可以使用了.然...
Android 5.0下载官网地址,Android 5.0下载安装教程步骤
13:43 南方财富网 ...
自动播放 2016回响中国腾讯网教育年度总评榜专访:曹辉 正在加载... 腾讯教育讯12月1...
【湖南长沙市手机行情】近日魅族科技正式对外发出了魅族新品发布会邀请函,这次邀请函...phalapi-入门篇6(小技巧和浅谈API适用范围以及入门篇总结)前言,为我们提供了这样一个优秀的开源框架.本篇文章的目的在于把框架自带的一些好用,封装好的一些方便开发的类库简单的说一下,灵活使用可以提高开发效率,再就是因为在交流过程中有很多童鞋提出了一些关于什么样的项目怎么用API和web端怎么使用API这类的问题,我就我的理解把我的一些想法和大家交流一下,最后是对于入门篇做一下总结,以及对后面的一些教程做一下说明.附上:官网地址:http://www.phalapi.net/开源中国Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release1. 小技巧在这里介绍的是一些比较基础是比如curl,log,和tools着一些基础的,关于cache,Cookie等一些会在后面进阶篇慢慢道来1.1 curl请求类其实在框架内部已经提供了Curl的请求类位置是在/Phalpi/Phalapi/CUrl.php// 构造方法接受参数为失败重试次数默认是1可以自己指定$curl = new PhalApi_CUrl(2);// 进行GET 返回请求结果$rs = $curl-&get('http://phalapi./Public/demo/?service=Default.Index');// 进行POST 返回请求结果$data = array('username' =& 'dogstar');$rs = $curl-&post('http://phalapi./Public/demo/?service=Default.Index', $data);1.2 log日志类在大部分时候都没办法实时知道报错信息,但是如果发生了错误我们需要记录起来,来提供给自己日后分析,或者是在运营环境中有个问题但是自己不是很确定可以通过debug日志的形式写入文件进行分析,框架有提供这方面的功能,在接口init.php中已经有下面这段话了//日记纪录DI()-&logger = new PhalApi_Logger_File(API_ROOT . '/Runtime',
PhalApi_Logger::LOG_LEVEL_DEBUG | PhalApi_Logger::LOG_LEVEL_INFO | PhalApi_Logger::LOG_LEVEL_ERROR);这样就已经注册了日志类API_ROOT . ‘/Runtime’这个是表示日志存放的路径(一定要保证有写入权限才能正常使用)使用如下//error 系统异常类DI()-&logger-&error('fail to insert DB', $data);//对应的LOG 20:37:55|ERROR|fail to insert DB|{"name":"dogstar","password":"123456"}//info 业务纪录类DI()-&logger-&info('add user exp', array('name' =& 'dogstar', 'before' =& 10, 'addExp' =& 2, 'after' =& 12, 'reason' =& 'help one more phper'));//对应的LOG 20:48:51|INFO|add user exp|{"name":"dogstar","before":10,"addExp":2,"after":12,"reason":"help one more phper"}//debug 开发调试类DI()-&logger-&debug('just for test', array('name' =& 'dogstar', 'password' =& '******'));//对应的LOG 20:37:55|DUBUG|just for test|{"name":"dogstar","password":"******"}文件存放的文件路径一般为Runtime/log/201502(年月)/(年月日).log1.3 tool工具类工具类的路径在/Phalpai/Phalapi/Tool.php中目前里面提供了两个工具(IP地址获取,随机字符串生成)使用方法入下,自己会经常使用的工具都可以放进去//实例化工具类$PhalApi_Tool = new PhalApi_Tool();//生成一个"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"组成的一个随机字符串根据输入的值决定长度$PhalApi_Tool-&createRandStr(5);//获取请求的IP这里的IP是外网IP$PhalApi_Tool-&getClientIp();2. 浅谈API适用范围其实想谈谈这个的原因是应为有人有疑问,Api适用范围是不是只局限于APP,还有就是如果是用 phalapi 提供一个后台管理的web项目的话要怎么去做,在这里根据一些笔者本人的一些肤浅的了解谈一谈我的认为,分一下几个场景进行说明.2.1 移动端我认为排在第一位的应该是移动应用比如Android和IOS上面的应用通讯肯定是需要使用到API通讯的(基本上是首选,很少有看到其他非接口形式的).2.1 提供服务(主要是平台类)提供服务(主要是平台类)比如银行来说,提供的支付接口,付款接口等,还有就是一些外卖平台,团购平台都有自己的一套接入API接受数据(这一些可能会偏向高端一点)2.1 长周期web项目长周期web项目,为什么要叫做长周期web项目,因为短期的项目比如5天的一个抽奖活动我是觉得实在没有必要去做成接口通讯的形式,这种短周期的项目直接拿着静态页面加上MVC框架去实现来的是划算一点(因为API和web通讯成本还是比较大的),对于长周期的项目来说使用API是有好处的如下:1.前后端分离,后端提供API服务,前端进行请求展示,让前端专注做前端的事情,让后端专注做后端的事情.2.升级迭代可以有效的减小维护成本,当迭代升级的时候,如果是后端没有变动,只是前端进行变动了可以很好的分开工作量.(前端一样)3.分离之后规范更加清晰,API有API的一套完整的开发规范,前端也一样,就不会和MVC框架一样代码堆积在一个地方4.高并发web项目优化目标准确,优化空间大,对于API来说就是可以单点优化.当前也有他的缺点,前期工作量会有所增加,沟通成本增加,但是我认为他带来的好处是持续的还有一个重点就是怎么实现通讯,我现在在项目中前端是使用js进行请求通讯的,这是比较常用的,还有一种设想PHP提供接口,然后node.js或者其他语言进行请求然后渲染出html代码给到前端进行展示,这样可以解决安全问题,而且node.js不需要进行数据操作性能也是非常好的.3. 入门篇总结经过了一个月交流入门篇也就在这里结束了,在入门篇里面吧一些关于Phalapi的基本使用方式都过了一遍,我也希望大家能动手都操作一遍,当如入门篇讲的是比较基础的东西,经验老到的童鞋过一过就行了,在后面的进阶篇里面跟过的会讲到概念和思想性的东西,比如DI思想单例模式,三层的好处等,而在实战篇中会着重讲解如何运用到实际开发中,怎么多项目共用框架等一些比较实际的一些教程,也希望大家能够进一步关注,再一次感谢喜欢Phalapi框架的你们,你们的关注就是我的动力!注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!官网QQ交流群:
欢迎大家的加入!
最新教程周点击榜
微信扫一扫

我要回帖

更多关于 phalapi 的文章

 

随机推荐