Typecho 框架基础之数据库类设计
Typecho_Db类
Typecho_Db类位于var/Typecho/Db.php
文件中,定义了DB连接资源和DB操作函数,譬如get()/select()/delete()/insert()/update()
等。
仔细阅读代码,Typecho_Db类主要封装了三类操作:
set和get,设置和获取数据库连接资源。
数据库操作函数,包括select/delete/update和insert
,以及支持sql语句和query对象的query函数fetchAll,fetchRow以及fetchObject
,从resource中获取具体数据的函数。
1.1. 设置和获取数据库资源
在get()
之前需要先调用set()
,但set()
函数在config.inc.php中由系统调用,所以我们无需关心set的过程,但需要了解get()
函数的用法。在一般的插件制作过程中,在使用typecho的数据库之前,需要调用get函数来获取资源,譬如:
$db = Typecho_Db::get();
$query= $db->query('some sql statment');
这样,通过静态方法get()
,即可获取Typecho中的单例MySQL连接实例,从而进行下一步的数据库操作,而无需关心数据库的连接细节。
1.2. 数据库操作
Typecho_Db类封装了四种最常用的数据库操作,依次是select、update、delete和insert,另外还提供了最基本的query查询函数
1.2.1
select/update/delete/insert的用法请参考下面的例子,为了集中讲解,这里不详细展开说明
1.2.2
query的可以支持更加复杂的sql操作,譬如drop等。
$db = Typecho_Db::get();
$query = $db->query('select * from '.$db->getPrefix().'metas ');
tips: $db->getPrefix()
函数获取在config.inc.php中配置了的表前缀,用于配置完整的表名。
query函数还可以接受Typecho_Db_Query对象,譬如:
$db=Typecho_Db::get();
$query=$db->select()->from('table.metas');
echo $query;//select * from typecho_metas;
1.3. 获取查询数据
如上文1.2.2中例子,假如已经获取了query,那么可以通过fetchAll、fetchRow或者fetchObject这三个方法进行数据获取。
1.3.1
fetchAll抽取所有行
$rows = $db->fetchAll($query);
foreach($rows as $row){
var_dump($row); //每一行的详细内容
}
1.3.2
fetchRow,每次抽取一行数据,返回Array类型
while($row = $db->fetchRow($query)){
$mid=$row['mid'];
//.......
}
1.3.3
fetchObject,类似fetchRow,但返回Object类型
while($row = $db->fetchObject($query)){
$mid=$row->mid;
//.......
}
注意:从例子可以看出,fetchObject和fetchRow的主要区别在于返回的类型不同,进而导致获取对象属性的方式不同而已。
适配器类,Typecho_Db_Adapter/Typecho_Db_Adapter_Mysql
Typecho_Db_Adapter_Mysql位于var/Typecho/Db/Adapter/Mysql.php
中,这只是一个适配器,无需过分关注。
SQL查询操作类Typecho_Db_Query
Typecho_Db_Query位于var/Typecho/Db/Queury.php
中,其中定义了query操作,包括where、limit等。
列举Typecho_Db_Query的常用函数,方便快速查找
$ var_dump(get_class_methods($db->select()->from('metas')));
array (size=21)
0 => string '__construct' (length=11)
1 => string 'setDefault' (length=10)
2 => string 'getAttribute' (length=12)
3 => string 'cleanAttribute' (length=14)
4 => string 'join' (length=4)
5 => string 'where' (length=5)
6 => string 'orWhere' (length=7)
7 => string 'limit' (length=5)
8 => string 'offset' (length=6)
9 => string 'page' (length=4)
10 => string 'rows' (length=4)
11 => string 'expression' (length=10)
12 => string 'order' (length=5)
13 => string 'group' (length=5)
14 => string 'having' (length=6)
15 => string 'select' (length=6)
16 => string 'from' (length=4)
17 => string 'update' (length=6)
18 => string 'delete' (length=6)
19 => string 'insert' (length=6)
20 => string '__toString' (length=10)