数据模型操作接口,IModel.class.php

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

interface IModel {

    //查询列表
    public function query($sql);

    /**
     * 添加数据
     * @param $data
     * @return int
     */
    public function add($data);

    /**
     * 替换数据
     * @param $data
     * @return boolean
     */
    public function replace($data);

    /**
     * 删除指定id的数据
     * @param $id
     * @return boolean
     */
    public function delete($id);

    /**
     * 删除指定条件的数据
     * @param $conditions
     * @return boolean
     */
    public function deletes($conditions);

    /**
     * 获取数据列表
     * @param array $conditions
     * @param array $fields
     * @param array $order
     * @param array $limit
     * @param $group
     * @param $having
     * @return mixed
     */
    public function &getItems($conditions, $fields, $order, $limit, $group, $having);

    public function &find();

    /**
     * 获取单条数据
     * @param $condition
     * @param $fields
     * @param $order
     * @return mixed
     */
    public function &getItem($condition, $fields, $order);

    public function &findOne();

    /**
     * 更新一条数据
     * @param $data
     * @param $id
     * @return bool
     */
    public function update($data, $id);

    /**
     * 批量更新数据
     * @param $data
     * @param $conditions
     * @return bool
     */
    public function updates($data, $conditions);

    /**
     * 获取指定条件的记录总数
     * @param $conditions
     * @return int
     */
    public function count($conditions);

    /**
     * 增加某一字段的值
     * @param tring $field
     * @param int $offset 增量
     * @param int $id
     * @return boolean
     */
    public function increase($field, $offset, $id);

    /**
     * 批量增加指定字段的值
     * @param string $field
     * @param int $offset 增量
     * @param array|string $conditions
     * @return mixed
     */
    public function batchIncrease($field, $offset, $conditions);

    /**
     * 减少某一字段的值
     * @param string $field
     * @param int $offset 增量
     * @param int $id
     * @return mixed
     */
    public function reduce($field, $offset, $id);

    /**
     * 批量减少某一字段的值
     * @param string $field
     * @param int $offset 增量
     * @param array|string $conditions
     * @return mixed
     */
    public function batchReduce($field, $offset, $conditions);

    /**
     * 更新某一字段的值(快捷方法,一次只能更新一个字段)
     * @param $field
     * @param $value
     * @param $id
     * @return mixed
     */
    public function set($field, $value, $id);

    /**
     * 批量更新某一字段的值
     * @see set()
     * @param $field
     * @param $value
     * @param $conditions
     * @return mixed
     */
    public function sets($field, $value, $conditions);

    //开启事务
    public function beginTransaction();

    //提交更改
    public function commit();

    //回滚
    public function rollback();

    //判断是否开启了事物
    public function inTransaction();

    /**
     * 写锁定
     * @return boolean
     */
    public function writeLock();

    /**
     * 读锁定
     * @return boolean
     */
    public function readLock();

    /**
     * 解锁
     * @return boolean
     */
    public function unLock();

    /**
     * @return IModel
     */
    public function where($where); //设置查询条件

    /**
     * @return IModel
     */
    public function field($fields); //设置查询字段

    /**
     * @return IModel
     */
    public function limit($from, $size);

    /**
     * @return IModel
     */
    public function sort($sort);

    /**
     * @return IModel
     */
    public function group($group);

    /**
     * @return IModel
     */
    public function having($having); //设置分组条件

    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->increase('tag_ids', ',4', $id);

执行成功之后,tag_ids 字段是的值就编程 1,2,3,4 了。是不是觉得 IModel::increase 这个方法很好用,从此你再也不用先把某个字段读取出来,然后再处理,然后再更新这么麻烦了。

还有一点要说明的时候,如果 $offset 是负数(包括int,float,decimal) 则表示你要减掉某个字段的值。但是这种情况我们推荐你使用 IModel::reduce这个方法来解决

reduce($field, $offset, $id); 这个用法跟 IModel::increase 一样,减少某一字段的值。

如果需要更新多条记录的话,你可以使用 IModel::batchIncreaseIModel::batchReduce 来解决

特别需要提醒的是,如果你需要同时更新一条记录的多个字段,尤其是有些要加,有些要减的,只需要给 $field 和 $offset 都传入数组就好了

比如再转账的时候,你要增加某个账户的余额,但是又要减少她的冻结资金,常规做法你是需要2步来实现,即先增加余额,然后再将她的冻结资金减少,这个2个操作你需要通过事务 来实现操作的原子性。那么现在你需要一步实现就好了,而且你不用担心操作的原子性。

$model = Loader::model('user');
$model->increase(array('balance', 'frozen'), array(100, -100) $userid);

除了事务的操作之外,IModel还提供了锁表 (writeLock(), readLock()) 和解锁表 (unLock()) 的操作

如果你想执行自定义的SQL语句的话,你可以通过 IModel::getDB 方法来实现

$sql = "select * from user";
$result = $model->getDB()->excute($sql);

find(), findOne()

IModel 提供了一种快捷的连贯操作,如果你觉得 IModel::getItems IModel::getItem 操作参数太多,那么你可能会 喜欢 IModel::findIModel::findOne 的连贯操作

$model = Loader::model('user');
$list = $model->where(array('city' => 'shenzheng'))
    ->field('id, username, password')
    ->sort(array('id' => -1))
    ->limit(0, 20)
    ->find();
Copyright © HerosPHP 2016 all right reserved,powered by Gitbook最后更新时间: 2017-03-07 07:08:30

results matching ""

    No results matching ""