Значение приращения CakePHP

Моя проблема выглядит следующим образом:

Я хочу сделать приложение для голосования, чтобы люди могли выбрать одно или несколько событий (например, Doodle). Для этого я настроил функцию под названием голосование. В представлении вы можете выбрать события, используя флажки. Модели опроса и группового события. Опрос имеет много групповых событий. Моя проблема, когда я звоню updateAll()все значения связанных групповых событий увеличиваются.

Вот мой код:

Посмотреть:

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.');
        }
    }
}

Как я могу заставить его работать так, чтобы только проверенные значения увеличивались?

заранее спасибо

Редактировать:

Спасибо за предложение с массивом. Но я пробовал определенные способы, которые не будут работать. Как мне создать этот массив?

2 ответа

Решение

Похоже, вы работаете updateAll запрос для всех групповых событий, назначенных выбранному опросу:

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

Вам необходимо создать массив с идентификаторами отмеченных групповых событий и добавить условие, которое будет ограничивать обновление только выбранными событиями:

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

У меня есть приложение, которое я разрабатываю, где я позволяю пользователям (через jQuery) голосовать "за" или "за" определенный комментарий. Вот как я это реализовал. Я в основном вызываю эту функцию через Ajax/jQuery, и она только увеличивает Комментарий на переданный аргумент; В моей таблице комментариев есть 2 поля - "Нравится" и "Не нравится". Один пример, если у waitU и у меня также есть voiceDown, который очень похож.

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'];
}

Позвольте мне знать, если у вас есть еще вопросы

Другие вопросы по тегам