2012-01-07 9 views
1

私の問題はなりますCakePHPの増分値

が、私は人々が(落書きのような)1つ以上のイベントを選択することができ投票アプリを作りたいです。 これについては、voteという関数を設定しました。ビューでは、チェックボックスを使用してイベント を選択できます。モデルは投票とグループイベントです。世論調査には多くのグループがあります。 私の問題はupdateAll()に電話すると、関連するGroupeventsのすべての値が になります。ここで

は私のコードです:

ビュー:

echo $this->Form->create('Poll', array('action' => 'vote')); 

for($i=0; $i<$count; $i++){ 
    echo $this->Form->input('Groupevent.'.$i.'.votes', array('type'=>'checkbox', 
     'label'=>$this->Groupevent['startTime'])); 
    echo $this->Form->input('Groupevent.'.$i.'.id', array('type'=>'hidden')); 
} 
echo $this->Form->input('id', array('type' => 'hidden')); 
echo $this->Form->end('vote'); 

コントローラー機能:ちょうどチェックする値がインクリメントますよう

function vote($id=null){ 
    $this->Poll->id = $id; 
    if ($this->request->is('get')) { 
     $this->request->data = $this->Poll->read(); 
     $this->set('count', $this->Poll->Groupevent->find('count', 
      array('conditions'=>array('Groupevent.poll_id'=>$this->Poll->id))));            
    } else { 
     unset($this->Poll->Groupevent->validate['poll_id']);    
     if ($this->Poll->Groupevent->updateAll(
       array('Groupevent.votes'=>'Groupevent.votes+1'), 
       array('Groupevent.poll_id'=>$this->Poll->id))) 
     {        
      $this->Session->setFlash('Your poll has been updated.'); 
      $this->redirect(array('action' => 'edit', $id)); 
     } else { 
      $this->Session->setFlash('Unable to update your poll.'); 
     } 
    } 
} 

がどのように私は、それを動作させることができますか?事前に

おかげ

編集:配列との示唆について

感謝。しかし、私はそれが動作しない特定の方法を試してみました。この配列を作成するにはどうすればいいですか?

答えて

4

あなたが選択したポーリングに割り当てられているすべてのGroupeventsためupdateAllクエリを実行しているように見えます:

if ($this->Poll->Groupevent->updateAll(
       array('Groupevent.votes'=>'Groupevent.votes+1'), 
       array('Groupevent.poll_id'=>$this->Poll->id))) 
     { 
... 

あなたがチェックGroupeventsのIDが持つ配列を作成し、更新を制限する条件を追加する必要がありますのみ選択したイベントに:

if ($this->Poll->Groupevent->updateAll(
       array('Groupevent.votes'=>'Groupevent.votes+1'), 
       array('Groupevent.id IN' => $selectedEventsIds), 
       array('Groupevent.poll_id'=>$this->Poll->id))) 
     { 
... 
+0

こんにちは、感謝を持っているなら、私に教えてください。しかし、私はこのデータから配列を作成することはできません。私は$ this-> data ['Groupevent']と$ this-> data ['Groupevent'] ['id']などを試しましたが、うまくいきませんでした。 – ulanBator

+0

提出後にprint_r($ this-> data)のダンプを貼り付けてください。 – bbb

+0

私はこれを試しましたが空です。 – ulanBator

0

私は(jQueryのスルー)、ユーザーがまたは特定のコメントを上下に投票することができますどこ私が開発していますアプリを持っています。これが私の実装方法です。私は基本的にAjax/jQueryを使ってこの関数を呼び出し、渡された引数でコメントをインクリメントします。私のコメント表には、「好き」と「嫌い」の2つのフィールドがあります。 voteUpと私にはかなり類似しているvoteDownもあります。

function voteUp($id = null){ 

    $this->autoRender = false; 
    if($this->RequestHandler->isAjax()){ 
     $this->Comment->id = $id; 
     // Basically I get the value of liked(Field in Db) and increment it by 1 
     $this->Comment->saveField('liked',$this->Comment->field('liked')+1); 
    }  
    $newValue = $this->Comment->findById($id);  
    //pass this value back to the view so it is displayed 
    //using jQuery 
    return $newValue['Comment']['liked']; 
} 

あなたはもう返事のための質問

+2

トラフィックの多いサイトでは、時にはお互いのデータを上書きしたり、カウントが逃したりする同時リクエストが発生する可能性があります(支払いなどの重大な状況では、これはうまくいかないため)。これらの状況をより安全に処理する '$ this-> Model-> updateAll(['x' => 'x + 1']、['id' => 1]);を使う方が良いでしょう。 –

+0

このアドバイスをいただきありがとうございます... –