zentaoPHP框架提供的DAO功能

2009-12-01 21:07:50
王春生
45352
最后编辑:石洋洋 于 2018-05-21 09:08:41
简介:zentaoPHP框架的dao功能。

一、关于DAO的说明

zentaoPHP并没有试着去实现ORM或者ActiveRecord这样的概念。因为我们相信,框架要留给开发人员足够的自由发挥的空间,而不是所有的都要包办。所以框架里面提供了一个简单方便的数据库访问对象类DAO。并且我们在封装DAO的时候尽可能的兼容标准的sql写法。

DAO类的定义在lib下面的dao.class.php中。框架在加载的时候,会自动生成$this->dao对象,可以在control, model或者view层的代码中直接使用$this->dao来执行各种方法。

二、执行方法的区别

如果是查询类的语句,需要使用fetch系列的方法来返回数据。更新,删除,替换这些方法可以使用exec()方法。

DAO在后执行的时候,有下面的方法:

fetch():         获得满足条件的第一次记录,返回的是对象格式。
fetch($filed):  获得满足条件的第一个记录的字段$field对应的值。
fetchAll():     获得满足条件的所有记录,以数组格式返回,索引为0-n
fetchAll($key):  获得满足条件的所有记录,并使用字段$key作为索引值。
fetchPairs($key, $value): 返回键值对的列表。如果不指定参数,则取返回记录中的第一个字段作为key,第二个字段作为value。
fetchGroup($group, $key): 把满足条件的记录按照$group字段进行分组。比如把所有$status=active的放在一起。

三、操作符说明

为了书写的方便,DAO类里面封装了若干操作符:

eq: equal,等于
ne: not equal,不等于
gt: great than, 大于
lt: little than, 小于
in: 介于一个列表中。
between: 在一个区间中。
notin:不在一个列表中。
like: 模糊匹配。

四、查询语句:

普通的查询:查询account=wwccss的记录。

$this->dao->select('*')
->from('user')
->where('account')
->eq('wwccss')
->fetch();
再复杂一点,加入andWhere (或者orWhere)
$this->dao->select('*')->from('user')
->where('id')->gt(10)
->andWhere('age')->lt(20)
->orderBy('id desc')
->limit('1,10')
->fetchAll()

左连接查询

$this->dao->select('t1.*, t2.*')->from('user')->alias('t1')->leftJoin('userGroup')->alias('t2')->on('t1.account = t2.account')->fetchAll();
其他便利的方法:
$this->dao->findByAccount($account)->from('user')->fetch();               // 魔术方法,按照account进行查询。
$this->dao->select('*')->from('user')->fetchAll('account');              // 返回的结果中,以account为key。
$this->dao->select('account, realname')->from('user')->fetchPairs();     // 返回account=>realname的键值对。
$this->dao->select('class, account, realname')->from('user')->fetchGroup('class');     // 按照所属的class进行分组
根据条件拼装SQL:beginIF, FI()
$this->dao->select('*')->from('user')->where('id')->gt(10)->beginIF($class == 'online')->andWhere('status')->eq('online')->fi()->fetchAll();

五、插入语句:

使用一个data对象来更新。data对象的key对应到数据表中字段名。

$user->account = 'wwccss';
$user->password = '123456';
$this->dao->insert('user')->data($user)->exec();

或者一个字段一个字段更新:

$this->dao->insert('user')
->set('account')->eq($account)
->set('password')->eq($password)
->exec();

获得后插入的记录id

echo $this->dao->lastInsertID();

六、更新语句:

更新语句和insert基本类似,可以使用一个data对象或者单个字段进行更新。

$user->name = 'wwccss';
$user->age = 10;
$this->dao->update('user')->data($user)->where('id')->eq($userid)->limit(1)->exec(); 

$this->dao->update('user')
->set('account')->eq($account)
->set('password')->eq($password)
->exec()

七、REPLACE语句

replace也是需要定义一个data对象,然后调用replace方法。需要注意的是replace要保证表有主键或者唯一索引。

$this->dao->replace('user')->data($user)->exec();

八、删除语句:

$this->dao->delete()->from('user')->where('id')->eq($userid)->exec();
评论列表
testZendao 2018-05-14 11:13:40
如何执行复杂一点的sql,比如创建删除视图,存储过程之类的,最好能写一个小实例,多谢
111 2018-05-14 11:19:03
$sql="drop view view_1 ;create or replace view view_1 as select .... from table ";
$this->dao->query($sql)->exec();
222 2018-03-09 20:03:01
$lang->project->menu->list = array('link' => '%s', 'fixed' => true);这个%s实在哪里链接的?
王春生 2018-03-14 08:38:21
在打印菜单的时候传参传进去的。
2018-02-25 17:37:18
请问sql语句链式操作怎么用
->where('t1.project')->eq('2') //必须满足该条件
->orwhere('t1.name')->eq('820076') //满足本条件 或满足下条条件
->orwhere('t1.name')->eq('820074')
请问正确的写法怎么写,手册上没找到
王春生 2018-02-28 09:53:05
两种方式,一种是markLeft, markRight来加括号。
第二种就是自己来写sql, $this->dao->query($sql)->fetch()
王春生 2018-02-28 09:53:54
你后面的orwhere可以变成and

andWhere(t1.name)->in('82,83')
春哥 2017-12-18 11:35:40
你好,请问$this->dao里面有这个sql函数吗?UNION ALL
王春生 2017-12-19 08:32:52
没有写这个。:)
111 2018-03-06 09:48:04
请问没有unionall,那,想获取两个表中的所有数据应该用那个啊,
王春生 2018-03-08 09:33:49
可以自己写sql。
Mr.Yuan 2017-12-08 12:02:31
春哥,问一下,我自己加了个模块带有选择导出的功能,为什么我选了几个复选框,浏览器cookie 中checkedItem有值,后台接收$this->cookie->checkItem却没有值是为什么呢?
王春生 2017-12-08 13:34:28
cookie可能没有传过去。
王春生 2017-12-08 13:35:58
那块的逻辑不太严谨。选中条目之后,点击导出,这时候才设置cookie。应当在选择条目的时候,就设置cookie。这样导出的时候,向后端发起请求,cookie可以保证正常传递过去。
Mr.Yuan 2017-12-08 15:00:11
这个逻辑是不是写在my.full.js中的那一段,$('.export').blind('click',function{}),为什么我删掉这个方法导出还是有效呢?
Mr.Yuan 2017-12-08 16:59:10
解决了,export文件里面的判断if($this->cookie->checkItem) 我换成了if($.cookie('checkItem')),然后再用隐藏域方式传到了后台就行了,直接获取没获取到
llwsykll 2017-11-22 11:57:09
春哥你好
我有一个需求需要获取bug表中所有数据,筛选出需要的列再输出,但是bug表中现在有12300条数据了,用fetchAll就会报错,有没有什么能够替代的办法呢?
王春生 2017-11-22 17:00:03
分批次查询。
gunsion 2017-10-27 17:31:17
使用$this->dao->query($sql)后,返回的statement对象有办法使用page实现分页吗?
傲霜 2017-10-25 09:34:13
请问一下是否支持同时连接多个数据库?不是主从数据库,我只是想通过PHP构建一个系统,同时展示其他几个系统的报表信息,需要访问几个不同的MYSQL数据库。非常感谢!
王春生 2017-10-26 09:26:22
两种方法。
1. 写sql的时候,加上库的名字。比如 from('a.table')
2. 自己再连接其他的数据库,创建dbh,dao可以通过dbh()方法切换句柄。
记得但又不全记得 2017-10-13 15:22:30
春哥,sql里面支不支持'DATE_FORMAT函数
王春生 2017-10-16 09:58:28
用时间戳查询应该也可以的。或者在外面用PHP先处理下。
春哥 2017-10-16 11:30:42
我现在要求每个月的数据,需要group by,用时间戳,还是会用到DATE_FORMAT
王春生 2017-10-17 08:26:12
自己拼装sql。$this->dao->query($sql)
gaga 2017-11-16 10:49:57
问下 因为我这个sql要用到 date_format(addedDate, '%Y%m%d') ;所以就手动拼接sql,但是$this->dao->query($sql) 这个最后返回的结果 是一个sql语句 是怎么回事,sql 拿出来执行是没问题的
王春生 2017-11-17 08:11:49
$this->dao->query($sql)->fetchAll()
用fetchALl, fetch这样的语句返回结果。
记得但又不全记得 2017-10-13 15:13:12
春哥,这个问题怎么弄呢?->andWhere('DATE_FORMAT(e.date,"%Y-%m")'),怎么让字段变为年月
1/7
发表评论
评论通过审核后显示。