1

私の問題は次のようになります。

人々が1つ以上のイベント(Doodleなど)を選択できる投票アプリを作りたいです。このために、私は投票と呼ばれる関数を設定しました。ビューでは、チェックボックスを使用してイベントを選択できます。モデルはPollとGroupeventです。投票には多くのグループイベントがあります。私の問題は、を呼び出すと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

2 に答える 2

4

updateAll選択した Poll に割り当てられたすべての Groupevents に対してクエリを実行しているようです。

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))) 
        {
...
于 2012-01-07T22:54:08.550 に答える
0

ユーザーが(jQueryを介して)特定のコメントに上または下に投票できるようにする開発中のアプリがあります。これが私がそれを実装した方法です。私は基本的に Ajax/jQuery を介してこの関数を呼び出し、渡された引数によってコメントをインクリメントするだけです。私のコメント テーブルには 2 つのフィールドがあります - Liked と Disliked です。1つの例は、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'];
}

他にご不明な点がありましたらお知らせください

于 2012-01-08T19:06:06.667 に答える