DB 操作接口
主要为数据模型提供了一些增删查改的接口,以及事务的处理,锁表等一些便捷操作。
//查询列表
public function getList($sql);
//添加数据
public function add($data);
//替换数据
public function replace($data);
//删除指定id的数据
public function delete($id);
//批量删除数据
public function deletes();
//获取数据列表
public function &find();
//获取单条数据
public function &findOne();
//根据ID获取数据
public function findById($id);
//更新一条数据
public function update($data, $id);
//批量更新数据
public function updates($data);
//获取指定条件的记录总数
public function count();
//增加某一字段的值
public function increase($field, $offset, $id);
//批量增加指定字段的值
public function batchIncrease($field, $offset);
//减少某一字段的值
public function reduce($field, $offset, $id);
//批量减少某一字段的值
public function batchReduce($field, $offset);
//更新某一字段的值(快捷方法,一次只能更新一个字段)
public function set($field, $value, $id);
//批量更新某一字段的值
public function sets($field, $value);
//开启事务
public function beginTransaction();
//提交更改
public function commit();
//回滚
public function rollback();
//判断是否开启了事务
public function inTransaction();
//写锁定
public function writeLock();
//读锁定
public function readLock();
//解锁
public function unLock();
//添加查询条件
public function where($field, $opt, $value);
//设置查询字段
public function field($fields);
//分页查询
public function page($page, $size);
//查询偏移量
public function offset($start, $size);
//设置排序
public function order($order);
//设置分组
public function group($group);
//添加分组条件
public function having($field, $opt, $value);
//获取数据库操作对象
public function getDB();
特别说明的一些方法
replace($data)
replace 方法用来更新或者增加一条数据,如果 $data 数组中包含了 primaryKey(主键)且该主键的数据再数据库中已经存在,则会自动更新这条数据,这个使用的是mysql内置的功能。
increase($field, $offset, $id)
增加某一字段的值,
- $field 字段名
- $offset 增量
- $id 查询ID(必须是主键)
这个方法通常是用增加int 和 float类型字段的值,比如说把点击率增加1,就可以直接使用 $model->increase('hits', 1, $id)
, 需要说明的是,如果字段是字符串类型的时候这个方法也是支持的:
比如说你有一个字段(tag_ids)记录的文章的标签ID, 你是用字符串连接的,tag_ids 的原始值是 1,2,3, 这个时候你调用
$model = Loader::model(UserDao::class);
$model->increase('tag_ids', ',4', $id);
//批量操作
$model->where('id', '>', 10)->batchIncrease('hits', 4);
执行成功之后,tag_ids 字段是的值就变成 1,2,3,4 了。是不是觉得 MysqlModel::increase
这个方法很好用,从此你再也不用先把某个字段读取出来,然后再处理,然后再更新这么麻烦了。
还有一点要说明的时候,如果 $offset
是负数(包括int,float,decimal) 则表示你要减掉某个字段的值。但是这种情况我们推荐你使用 MysqlModel::reduce
这个方法来解决
reduce($field, $offset, $id); 这个用法跟
MysqlModel::increase
一样,减少某一字段的值。
如果需要更新多条记录的话,你可以使用 MysqlModel::batchIncrease
和 MysqlModel::batchReduce
来解决
特别需要提醒的是,如果你需要同时更新一条记录的多个字段,尤其是有些要加,有些要减的,只需要给 $field 和 $offset 都传入数组就好了
比如再转账的时候,你要增加某个账户的余额,但是又要减少她的冻结资金,常规做法你是需要2步来实现,即先增加余额,然后再将她的冻结资金减少,这个2个操作你需要通过事务 来实现操作的原子性。那么现在你需要一步实现就好了,而且你不用担心操作的原子性。
$model = Loader::model(UserDao::class);
$model->increase(array('balance', 'frozen'), array(100, -100) $userid);
除了事务的操作之外,MysqlModel还提供了锁表 (writeLock(), readLock()) 和解锁表 (unLock()) 的操作
如果你想执行自定义的SQL语句的话,你可以通过 MysqlModel::getDB
方法来实现
$sql = "select * from user";
$result = $model->getDB()->getList($sql);
find(), findOne(),findById()
一个完整的例子
$model = Loader::model(UserDao::class);
$item = $model->alias('a')
->where('id', '>', 100)
->where(function($model) use($model) {
$model->where('name', 'xiaoming')->where('title', 'LIKE', '%条件1%');
})
->where(function($model) use($model) {
$model->where('name', 'xiaozhang')->where('title', 'LIKE', '%条件2%');
})
->fields('id,name,username,password')
->find();
$items = $this->service->alias('a')
->fields('a.id, a.username, a.password, b.create_by, create_date, b.number')
->join('content b', MYSQL_JOIN_RIGHT)
->on('a.id = b.id')
->findOne();