cakePHP更新表字段

时间:2013-02-07 01:22:26

标签: mysql cakephp sql-update cakephp-2.0

我有一个cakePHP问题 - 我想像这样做一个更新查询

UPDATE table SET field = field + some_var

我不知道怎么做......

任何人都可以帮助我吗?

5 个答案:

答案 0 :(得分:7)

唯一“正确”的方式是使用cake的“原子查询”包装器方法。在你的情况下,这将是“updateAll”。 这个问题完全重复了十几个其他问题 - 比如Incrementing Cakephp database field by a value

$var = 1;
$this->Article->updateAll(
    array('Article.viewed' => 'Article.viewed + ' . $var),                    
    array('Article.id' => $id)
);

这也在文档中:http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-array-conditions

答案 1 :(得分:4)

有两种方法可以进行更新:

如果您只更新一个字段,则可以执行以下操作:

$this->Model->id = foo;
$this->Model->saveField('field_name', 'field_value');

或者,您可以使用$ this->模型 - >保存():

进行更新
$data = array(
    'Model'=>array(
        'id'=>foo,
        'field_name'=>'field_value',
        'another_field_name'=>'another_field_value'
    )
);

$this->Model->save($data);

您希望避免使用$ this-> Model-> query()并使用CakePHP的内置方法,因为构建方法与数据源无关(它们在MySQL,Oracle,MSSQL等上的工作方式相同)。 p>

答案 2 :(得分:0)

您可以使用beforeSave之前的回调方法来实现您所需的功能。

Callback Method: BeforeSave

public function beforeSave($options = array()) {
    if (!empty($this->data['table']['field'])){
         $this->data['table']['field'] += $this->data['table']['some_var'];
    }
    return true;
}

答案 3 :(得分:0)

我认为最好的方法是使用Model::updateAll(array $fields, array $conditions)

当您尝试使用显示Model::saveField(string $fieldName, string $fieldValue, $validate = false)的相同主键进行更新时,cannot replace duplicate key error此方法。并且当一次更新时,他们必须使用主键作为匹配值来更新值。

答案 4 :(得分:0)

使用

$this->Baker->updateAll(
    array('Baker.approved' => 'Baker.approved + ' . $some_var),
    array('Baker.id' => $someId)
);

有关详细信息,请参阅:http://book.cakephp.org/2.0/en/models/saving-your-data.html