zentaoPHP框架提供的DAO功能

2009-12-01 21:07:50
王春生
59591
最后编辑:石洋洋 于 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();
评论列表
2019-10-19 14:54:39
select * from user where 1 AND (schoolId = '2' OR source = '山东')这种要怎么串?
R4rog 2019-09-27 17:54:24
mysql当字段是文本类型时,排序会有问题,比如版本号的字段version,值分别为 2.0.0.9和2.0.0.10,使用倒序ORDER BY `version` DESC时, 2.0.0.9会排在2.0.0.10前面,但是正确的应该时2.0.0.10比较大要排在前面。

因为版本需要点分割,字段不能转换成数字类型,网上查到的解决办法是使用这样的方式进行排序 ORDER BY INET_ATON(SUBSTRING_INDEX(CONCAT(version,'.0.0.0'),'.',4)) DESC,测试可以正常排序。

但是dao的orderBy方法不支持这样使用orderBy("INET_ATON(SUBSTRING_INDEX(CONCAT(version,'.0.0.0'),'.',4)) DESC"),我现在的解决办法是将dao语句生成原生sql语句,再拼接排序,然后再查询数据:
$sql = $this->dao->select('*')->from(TABLE_APPLICATION)->where('status')->eq(1)->get();
$sql .= " INET_ATON(SUBSTRING_INDEX(CONCAT(version,'.0.0.0'),'.',4)) DESC";
$data = $this->query()->fetchAll($sql);

只是临时的解决了排序问题,不知道是否有更好的解决办法。
王春生 2019-09-27 21:04:06
字符串本来就是这样的。
王春生 2019-09-27 21:07:13
转成数字的不就可以了。
张生 2019-07-29 22:50:24
在win环境下使用phpstudy环境测试正常的代码,部署到ubuntu下面时,提示getlist里传的参数有问题,出错提示如下:
[Mon Jul 29 22:45:19.705475 2019] [:error] [pid 18328] [client 120.229.54.242:45424] PHP Fatal error: Uncaught Error: Call to a member function query() on null in /var/www/html/proj/lib/base/dao/dao.class.php:382\nStack trace:\n#0 /var/www/html/proj/lib/base/dao/dao.class.php(740): baseDAO->count('')\n#1 /var/www/html/proj/module/book/model.php(29): baseDAO->page(Object(pager))\n#2 /var/www/html/proj/module/study/control.php(39): bookModel->getList(Object(pager))\n#3 /var/www/html/proj/framework/base/router.class.php(1690): study->index(0, 20, 0)\n#4 /var/www/html/proj/index.php(31): baseRouter->loadModule()\n#5 {main}\n thrown in /var/www/html/proj/lib/base/dao/dao.class.php on line 382
王春生 2019-07-30 11:57:44
SQL有问题。
rohmcher 2019-07-25 19:42:10
请问下 怎么在代码中调用mysql数据库中的存储过程?
王春生 2019-07-26 08:42:26
可以试试$this->dao->query($sql)->exec() 或者$this->dao->query($sql)->fetchAll()
foreach遍历数组问题 2019-06-18 19:41:51
<?php foreach($array as $key);?><?php endforeach; ?>用这个来遍历数组浏览器报endforeach语法错误,注释endforeach后,只显示一条数据,请问这要如何处理,
rexxx 2019-05-24 10:18:47
您好,请问这个事物的话要怎么用呢
王春生 2019-05-27 14:56:41
$this->dao->begin()->xxxx->commit();
h 2019-04-24 13:56:38
王老师,我写了一句原生sql那么怎么执行这个sql呢
h 2019-04-24 13:57:17
我看了看文档,没找见有执行原生sql的地方
王春生 2019-04-24 17:31:43
$this->dao->query()
hzk 2019-04-15 13:58:47
CONCAT(',', plan, ',') LIKE '%,19,%' 请问一下这个语句拼接后是什么样子呢?
王春生 2019-04-15 17:40:05
你可以用$this->dao->xxxx()->printSQL()看最终组装的sql是什么。
peng 2019-03-22 16:10:43
您好,请问dao语句怎么去比较日期? 我按照如下写不生效,麻烦给看下,谢谢!
->andWhere('t1.deadline')->lt(date('Y-m-d h:i:s'))
->andWhere('t1.deadline')->ne('0000-00-00')
王春生 2019-03-22 20:39:09
可以把最后的exec, fetch等函数改成 printSQL(),就可以打印出来拼装完之后的SQL。
peng 2019-03-25 10:34:04
sql打印出来在数据库执行日期条件是能起到过滤作用的,但是程序里日期条件没起到作用,所以我想知道日期的比较这样写是否有问题?
任康 2019-03-13 13:44:22
你好,我现在在做二次开发,涉及到多个数据库的增删改查,请问如何操作多个数据库呢?
王春生 2019-03-14 09:24:58
表名前面加上数据库名就可以了。

select * from zentao.user
1/9
发表评论
评论通过审核后显示。