spModel的update函数如何处理自增

#1 asterocean

比如,credit为整数,需要增加5,如何写update语句?

$item->update('id=1',array('credit'=>'credit+5'));

这样不行,因为对应的sql语句是
update item set credit='credit+5' where id=1;

该如何修改呢?

2011-04-21 14:08:40

#2 asterocean

搜索了以前的帖子,看到如下方法

spClass('lib_XXX')->incrField($conditions,'views','2');
这是views字段+2

如果同时增加两个字段,似乎就无法处理了。

2011-04-21 14:16:44

#3 jake

搜索了以前的帖子,看到如下方法

spClass('lib_XXX')->incrField($conditions,'views','2');
这是views字 ...
asterocean 发表于 2011-4-21 14:16
用两个incrField,或者直接些SQL。

2011-04-21 14:29:56

#4 windman

自己扩展下,未测试
可改造或加个新方法

/**
  * 为设定的字段值增加
  * @param conditions    数组形式,查找条件,此参数的格式用法与find/findAll的查找条件参数是相同的。
  * @param set    数组形式,需要增加的字段名称,该字段务必是数值类型,和增加的值,务必是数值,具体用法见源文件
  * @param operator    运算符,递增或递减
  */
public function incrField($conditions, $set , $operator = '+')
{
  $where = "";
  if(is_array($conditions)){
   $join = array();
   foreach( $conditions as $key => $condition ){
    $condition = $this->escape($condition);
    $join[] = "{$key} = {$condition}";
   }
   $where = "WHERE ".join(" AND ",$join);
  }else{
   if(null != $conditions)$where = "WHERE ".$conditions;
  }
  if(is_array($set)){
            $join = array();
            foreach($set as $val) {
                if(isset($val['normal'])) { // 加此项可以同时更新非增量的数据
                    $value = $this->escape($val['value']);
                    $join[] = "{$val['field']} = {$value}";
                } else {
                    if(isset($set['operator'])) { // 既有递增又有递减的情况下可以自定义运算符
                        $operator = $set['operator'];
                    }
                    $join[] = "{$val['field']} = {$val['field']} {$operator} {$val['value']}";
                }
            }
            $values = join(", ", $join);
  }
  $sql = "UPDATE {$this->tbl_name} SET {$values} {$where}";
  return $this->_db->exec($sql);
}


//下面的可以干掉或者做如此修改

/**
  * 为设定的字段值减少
  * @param conditions    数组形式,查找条件,此参数的格式用法与find/findAll的查找条件参数是相同的。
  * @param field    字符串,需要减少的字段名称,该字段务必是数值类型
  * @param operator    运算符,递增或递减
  */
public function decrField($conditions, $set, $operator = '-')
{
  return $this->incrField($conditions, $set, $operator);
}

用法:
$conditions = null;
  $set = array(
            array('field' => 'username', 'value' => 'jake', 'normal' => true),
            array('field' => 'real_total', 'value' => 1),
            array('field' => 'unique_total', 'value' => 1),
            array('field' => 'experience', 'value' => 10, 'operator' => '-'),
  );
$this->incrField($conditions, $set);

顺便说句,空格拷过来还保留,TAB缩进全没了

2011-04-26 23:01:21

#5 jake

speedphp框架应用层用的是MVC架构,遵循面向对象的编程方法。

所以,spModel中的incrField/decrField,都可以通过继承重写的方法来改写,而不需要改变spModel原有的代码,这是面向对象的好处之一。

开发者大可以另外做个m_model,在自己的应用里面继承于spModel并重写部分操作,这样即可以用spModel自带的其他方法,也可以拥有自己的特色函数。

重写CRUD操作:http://speedphp.com/model-override.html

里面就有“任何开发者可以想到的增强spModel原有函数的操作。”,你可以看看:)

2011-04-27 07:23:04

#6 windman

呵呵,是啊,继承更好,原模型保持简单就好

2011-04-27 09:20:17

#7 vsxp

跟帖学习。

2011-04-27 09:33:41

#8 vsxp

跟帖学习。:)

2011-04-27 09:33:48