更新CakePHP中的第+1行

时间:2011-01-25 16:37:13

标签: cakephp

我正在尝试更新数据库中的一行但是没有找到一种方法以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');

如何在不首先查询行,检索值,然后使用我获得的信息更新行的情况下执行此操作?

2 个答案:

答案 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 - 然后保存模型。