- 1 认识 zentaoPHP 框架
- 2 入口文件
- 3 配置管理
- 4 模块管理
- 4.1 控制器(control)
- 4.2 业务逻辑(model)
- 4.2.1 定义 model
- 4.2.2 跨模块调用
- 4.2.3 获取模块名
- 4.2.4 删除记录
- 4.2.5 数据处理对象 dao
- 4.3 模版视图(view)
- 4.4 从 hello world 开始
- 4.5 模块的配置
- 4.6 模块的语言
- 4.7 模块的 CSS 和 JS 管理
- 5 类库
- 6 扩展机制
- 6.1 扩展机制简介
- 6.2 新增独立模块
- 6.3 对控制层(control)扩展
- 6.4 对模型层(model)扩展
- 6.5 对视图层(view)扩展
- 6.6 对样式表和js进行扩展
- 6.7 对语言配置进行扩展
数据库操作类
- 2021-09-27 11:01:49
- admin
- 2351
- 最后编辑:admin 于 2022-10-19 10:05:30
一、关于 dao 的说明
zentaoPHP 并没有试着去实现 ORM 或者 ActiveRecord 这样的概念。因为框架应该留给开发人员足够的自由发挥的空间,而不是包办所有。所以框架里面提供了一个简单方便的数据库访问对象类 dao。并且框架在封装 dao 的时候尽可能的兼容标准的 SQL 写法。
dao 类的定义在 lib/base/dao/ 下面的 dao.class.php 中。框架在加载的时候,会自动生成 $this->dao 对象,可以在 control, model 或者 view 层的代码中直接使用 $this->dao 来执行各种方法。
二、执行方法的区别
插入、更新、删除数据这些操作使用 exec() 方法,该方法返回值是操作的记录数,例如删除了5条记录,则返回值为5。
如果是查询类的语句,需要使用 fetch 系列的方法来返回数据。
查询时 fetch 系列方法:
fetch(): 获得满足条件的第一次记录,返回的是对象格式。 fetch($filed): 获得满足条件的第一个记录的字段$field对应的值。 fetchAll(): 获得满足条件的所有记录,以数组格式返回,索引为0-n fetchAll($key): 获得满足条件的所有记录,并使用字段$key作为索引值。 fetchPairs($key, $value): 返回键值对的列表。如果不指定参数,则取返回记录中的第一个字段作为key,第二个字段作为value。 fetchGroup($group, $key): 把满足条件的记录按照$group字段进行分组。比如把所有$status=active的放在一起。
三、操作符说明
为了书写的方便,dao 类里面封装了若干操作符:
eq($value): equal,等于 ne($value): not equal,不等于 gt($value): great than, 大于 ge($value): great equal, 大于等于 lt($value): little than, 小于 le($value): little equal, 小于等于 between($min, $max): 在一个区间中。 in($ids): 介于一个列表中。$ids 是以','分割的字符串或者数组 notin($ids):不在一个列表中。$ids 是以','分割的字符串或者数组 like($string): 模糊匹配。 notLike($string): 模糊匹配。
四、查询语句
普通的查询:
// 查询 account=jack 的记录。 $this->dao->select('*') ->from('user') ->where('account') ->eq('jack') ->fetch();
还可以加入 andWhere 或者 orWhere(相当于 SQL 里的 and 、or )。
$this->dao->select('*')->from('user') ->where('id')->gt(10) ->andWhere('age')->lt(20) ->orderBy('id desc') ->limit('1,10') ->fetchAll()
再复杂一点,在 where 子句中使用圆括号:
markLeft($count = 1) // 在左边添加'('
markRight($count = 1) // 在右边增加')'
参数 $count 为添加圆括号的个数,默认为1。
任何时候使用具有 and 和 or 操作符的 where 子句,都应该使用圆括号明确地分组操作符。 例如:
$queries = $this->dao->select('id, title') ->from(table_userquery) ->where() ->markleft(1) ->where('account')->eq($this->app->user->account) ->orwhere('common')->eq(1) ->markright(1) ->andwhere('module')->eq($module) ->orderby('id_desc') ->fetchpairs();
左连接查询:
alias() 是表别名,相当于 SQL 里的 AS。(as 是 PHP 的关键词,使用 alias 代替)
$this->dao->select('t1.*, t2.*')->from('user')->alias('t1')->leftJoin('userGroup')->alias('t2')->on('t1.account = t2.account')->fetchAll();
分组查询:
groupBy($groupBy) // 创建 GROUP BY 部分,根据字段对结果集进行分组
having($having) // 创建 HAVING 部分,对分组的数据记录进行筛选。
/** * Get report data of resolved bugs per day. * * @access public * @return array */ public function getDataOfResolvedBugsPerDay() { return $this->dao->select('DATE_FORMAT(resolvedDate, "%Y-%m-%d") AS name, COUNT(*) AS value')->from(TABLE_BUG) ->where($this->reportCondition()) ->groupBy('name') ->having('name != 0000-00-00') ->orderBy('resolvedDate') ->fetchAll(); }
魔术方法:
findbyXXX() // 转换为 where 条件语句。
fetchXXX() // 获取指定个数的记录。如 fetch10 获取10条记录。
$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();
获取查询记录条数:count()
$count = $this->dao->select('id')->from(TABLE_SCORE)->where('account')->eq($account)->count();
五、插入语句
使用一个 data 对象来更新。data 对象的 key 对应到数据表中字段名。
我们也可以传给 data() 方法一个数组作为参数,data() 方法会将关联数组转化为 sql 语句中 key = value 的形式。
$user->account = 'jack'; $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 = 'jack'; $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();
九、执行 SQL 语句
使用 query() 方法可以直接执行 SQL 语句:
$this->dao->query(DELETE FROM blog WHERE id = '2') ;
使用 get() 方法可以获取执行的 SQL 语句字符串 :
$this->dao->delete()->from('blog')->where('id')->eq($id)->exec(); echo $this->dao->get();
输出结果:DELETE FROM blog WHERE id = '2'