2011-01-25 8 views
3

データベースの行を更新しようとしていますが、CakePHPの方法でこれを行う方法が見つかりません(unless I query the row to retrieve and update)。 、その後、私が得た情報で行を更新し、値を取得、私は最初の行を照会せずにこれを行うにはどうすればよいCakePHPで行+1を更新する

$this->db->set('field', 'field+1', FALSE); 
$this->db->where('id', 1); 
$this->db->update('mytable'); 

CodeIgniterので
UPDATE mytable (field) VALUES (field+1) WHERE id = 1 

は、のように簡単だったでしょうか?

答えて

11

私はCakePHPがこれを通常のsave()で1行で実行するのと同じ方法はないと思います。

が、複数の行を更新するすべて更新()メソッド、そうのような支持SQLスニペットを行います

$this->Widget->updateAll(
    array('Widget.numberfield' => 'Widget.numberfield + 1'), 
    array('Widget.id' => 1) 
); 

最初paramは更新するフィールド/値の配列であり、及び第二PARAMであります更新する行の条件。あなたは生のSQLを照会することができます

$this->Widget->query('YOUR SQL QUERY HERE'); 

を:

は、それとは別に、私は唯一のものを使用すると思います。 [EDIT:しかし、これはそれがORMをバイパスとして推奨ないである。]

+0

あなたがquery()を推奨し始めるまで、あなたは大丈夫でしたか? – dogmatic69

+0

@ dogmatic69 - そうだと思います。私はCRUDのような操作のために自分自身を使うことは決してありません。テーブルメタデータや本当に珍しいもので作業するのは便利だと思う唯一の時間です。 – Jamie

+0

もしあなたがこのルートを訪れるなら、行動のコールバックが(少なくとも私の知る限りは) –

1

基本的にあなたがIDを渡している、それはあなたread the Widget modelが存在する場合(nullとして、上記の注意事項を参照してください。この

<?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()); 
     } 
    } 
?> 

をお試しください最初のparamはテーブル全体を読み込みます)、Model::setを使用して、フィールド自体をchar */varcharとして格納する場合はintにキャストしてから、モデルを保存してください。

+0

OPは、更新する前に行を照会したくないと言っていました。これはread()と同じです。また、Widget-> field()はメソッドであり、プロパティではないので、カッコが必要で、フィールド名もパラメータとして渡す必要があります。 – Jamie

+0

コードをもう一度読んでください。私はModel :: set not Model :: fieldを使用しました。私はdocsとapiで指定されたとおりに使用しました。 - この場合、Model :: setを使用して 'field'カラムを値に設定します。提供するフィールド名の選択を混乱させるが、あなたのコメントはあなたが非常に注意深く読まなかったことを暗示している。私は要件を更新する前に、クエリがないので、私たちが偶数であると推測しました。 –

+0

+1これはとにかく素敵な情報です –

関連する問題