【问题标题】:cakePHP update table fieldscakePHP 更新表字段
【发布时间】:2013-01-22 09:56:22
【问题描述】:

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

UPDATE table SET field = field + some_var

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

谁能帮帮我?

【问题讨论】:

    标签: mysql cakephp sql-update cakephp-2.0


    【解决方案1】:

    你可以使用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;
    }
    

    【讨论】:

    • 这是不正确的。尽管这具有将两个值相加的效果,但它并不能说明可能存在两个重叠操作的事实。例如,如果您几乎同时进行两笔存款,一笔 10 美元,一笔 100 美元,则只有最后一笔存款会被应用。原始查询将捕获两者,因为它不依赖模型中的数据来计算答案。
    • 是的,你是对的。使用 $this->query("UPDATE table SET field = field + some_var") 更好。
    【解决方案2】:

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

    如果您只更新一个字段,您可以这样做:

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

    【讨论】:

      【解决方案3】:

      唯一“正确”的方法是使用 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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          使用

          $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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多