我正在尝试更新数据库中的一行但是没有找到一种方法以CakePHP方式(unless I query the row to retrieve and update)
执行此操作。
UPDATE mytable (field) VALUES (field+1) WHERE id = 1
在CodeIgniter中,它可以简单到:
$this->db->set('field', 'field+1', FALSE);
$this->db->where('id', 1);
$this->db->update('mytable');
如何在不首先查询行,检索值,然后使用我获得的信息更新行的情况下执行此操作?
答案 0 :(得分:12)
我不认为CakePHP在单行的普通save()中有类似的方法。
但更新多行的updateAll()方法确实支持SQL代码片段,如下所示:
$this->Widget->updateAll(
array('Widget.numberfield' => 'Widget.numberfield + 1'),
array('Widget.id' => 1)
);
第一个参数是要更新的字段/值数组,第二个参数是要更新行的条件。
除此之外,我认为唯一可以使用:
$this->Widget->query('YOUR SQL QUERY HERE');
它允许您使用原始SQL进行查询。 [编辑:但这是不推荐,因为它绕过了ORM。]
答案 1 :(得分:1)
试试这个
<?php
class WidgetsController extends AppController {
public function someFunction( $id = null ){
if( $id ){
// read all fields from the model
// alternately you can $this->Widget->read( array( 'field' ), $id );
$this->Widget->read( null, $id );
// grab the 'field' field so we don't have to type out the data array
$field = $this->Widget->data[ 'Widget' ][ 'field' ];
// where field is the name of the field to be incremented
$this->Widget->set( 'field', $field + 1 );
$this->Widget->save( );
}
// someday cake devs will learn to spell referrer
$this->redirect( $this->referer( ));
}
}
?>
基本上你传递id,如果它存在read the Widget model(参见上面的注释,null作为第一个参数读取整个表)然后你使用Model::set将字段转换为a值1比自身大 - 如果将字段存储为char / varchar,请记得转换为int - 然后保存模型。