Значение приращения 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'];
}
Позвольте мне знать, если у вас есть еще вопросы