#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
#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