数据库操作类

2021-09-27 11:01:49
admin
411
最后编辑:admin 于 2021-12-14 10:37:57

一、关于 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 系列的方法来返回数据。

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=jack 的记录。

$this->dao->select('*')
->from('user')
->where('account')
->eq('jack')
->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 对应到数据表中字段名。

我们也可以传给 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();
发表评论
评论通过审核后显示。