1

我有一个 cakePHP 问题 - 我想进行这样的更新查询

UPDATE table SET field = field + some_var

而且我不知道该怎么做...

谁能帮我?

4

5 回答 5

7

唯一“正确”的方法是使用 cake 的“原子查询”包装方法。在您的情况下,这将是“updateAll”。该问题是其他十几个问题的完整副本-例如按值递增 Cakephp 数据库字段

$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

于 2013-02-07T09:48:14.007 回答
4

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

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

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

或者,您可以使用 $this->Model->save() 进行更新:

$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 等上的工作方式相同)

于 2013-02-07T09:40:45.003 回答
0

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

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

于 2014-01-03T05:41:57.020 回答
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

于 2014-01-03T07:10:46.453 回答
0

您可以使用回调方法 beforeSave 来实现您所需要的。

回调方法:BeforeSave

public function beforeSave($options = array()) {
    if (!empty($this->data['table']['field'])){
         $this->data['table']['field'] += $this->data['table']['some_var'];
    }
    return true;
}
于 2013-02-07T01:37:31.973 回答