zentaoPHP框架提供的DAO功能-5.2

一、关于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();

评论


评论列表
大兴安岭 2016-05-11 10:00:22
sql包含查询find_in_set为何不支持呢?
王春生 2016-05-11 17:31:46
没有封装。可以自己封装下。
xiaoshao 2016-04-28 15:46:57
请问能不能打印sql语句?
王春生 2016-04-29 08:25:05
最后printSQL()
holala 2016-03-30 15:47:41
请问多表查询中使用别名怎么写,比如->from(TABLE_TASK)->alias('t1'),这是单表,如果有另一个表TABLE_USER也放到form里面并使用别名,怎么实现,谢谢!
王春生 2016-03-31 13:09:30
用leftJoin,文档里面有例子,代码里面也有很多例子。
xiii 2016-03-15 14:49:53
INSERT INTO zentaodev.zt_rdattendance (AttPeriod , AttAccount , AttWorkday , AttNight , AttHalfday , AttOneday , AttHoilday , AttTripday , AttAbsentday , Attlateday , AttLeaveday) VALUES (201602 , 02008 , 31 , 2 , 1 , 0 , 2 , 0 , 0 , 1 , 0 ) ON DUPLICATE KEY UPDATE AttWorkday = 31
为什么我直接在sql里面可以执行,用$this->dao->query($sql)->fetchAll()就报错了,原语句意思是存在就更新,不存在就插入
王春生 2016-03-16 08:14:32
你可以试试$this->dao->query($sql)就行了。
不用fetchAll()。
没有用过这种写法,你可以试试用replace语句吧。
张三 2016-02-17 16:55:23
不知道支不支持原生SQL语句啊,框架里有木有提供个方法啊。
王春生 2016-02-17 17:12:05
$this->dao->query($sql)->fetchAll()
沧海 2016-02-03 00:49:55
我业务上其实是存在多个库需要连接,框架未来是否可以实现这个功能,以前我用的是discuz,可以实现多数据库连接
王春生 2016-02-05 17:04:12
表名可以直接带数据库的名字。
select()->from(a.user)
沧海 2016-02-16 23:30:44
自己进行了一些改造,可以连接多个数据库了,根据表的索引图访问指定的数据库。
沧海 2016-01-28 21:45:05
lt: llittle than, 小于
llittle多了一个 l ?
王春生 2016-02-01 10:42:58
谢谢,已经更正。
虎虎 2016-03-11 14:10:54
应该是less than?
王春生 2016-03-11 16:05:01
嗯。
阿玉 2016-01-21 18:36:11
请问需要用到子查询,应该如何用DAO组装?即from的不是表名,而是另一个查询,如:
$this->dao->select('*')
->from('select * from table where type = 1 order by id desc')
->where('account')
->eq('wwccss')
->fetch();
谢谢!
王春生 2016-01-22 08:09:35
我们一般是在php里面查询一个列表出来,然后在用in语句。
我们的程序不用子查询。
阿玉 2016-01-22 09:47:44
非常感谢春哥回复!
su 2016-01-08 11:47:52
fetchGroup分组怎么实现的?直接带参数怎么不行?
粟江 2016-01-07 13:19:48
框架是不是不支持SUM等函数的查询?
粟江 2016-01-07 13:50:34
多表联接查询是不是不支持?
王春生 2016-01-14 09:28:43
写leftJoin语句。
王春生 2016-01-08 09:26:37
$this->dao->select('sum(xxx) as xxxx')这样。

版权声明:
作者:xiaoniba
链接:https://blog.xiaoniba.com/2016/05/30/zentaophp%e6%a1%86%e6%9e%b6%e6%8f%90%e4%be%9b%e7%9a%84dao%e5%8a%9f%e8%83%bd-5-2/
来源:小泥吧的博客
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>