DB 操作接口

优质
小牛编辑
140浏览
2023-12-01

主要为数据模型提供了一些增删查改的接口,以及事务的处理,锁表等一些便捷操作。

//查询列表
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::batchIncreaseMysqlModel::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();