【问题标题】:CakePHP increment valueCakePHP 增量值
【发布时间】:2012-01-07 22:01:30
【问题描述】:

我的问题如下:

我想制作一个投票应用程序,人们可以在其中选择一个或多个事件(如涂鸦)。 为此,我设置了一个名为 vote 的函数。在视图中,您可以选择事件 使用复选框。模型是 Poll 和 Groupevent。民意调查有许多 Groupevents。 我的问题是当我调用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.');
        }
    }
}

我怎样才能让它工作,以便只增加检查的值?

提前致谢

编辑:

感谢您对数组的建议。但我已经尝试了某些方法它不会工作。如何创建这个数组?

【问题讨论】:

    标签: php cakephp has-many increment update-all


    【解决方案1】:

    您似乎正在对分配给选定投票的所有 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))) 
            {
    ...
    

    【讨论】:

    • 嗨,感谢您的回复。但我无法从这些数据中创建一个数组。我尝试了 $this->data['Groupevent'] 和 $this->data['Groupevent']['id'] 以及其他一些方法,但没有成功。
    • 能否请您在提交后粘贴 print_r($this->data) 的转储?
    • 奇怪。检查 $_POST 变量怎么样?这不是很蛋糕的方法,但仍然可以用于调试目的......
    • 终于成功了。我只是在尝试不同的方法,直到它奏效。感谢您的帮助!
    【解决方案2】:

    我正在开发一个应用程序,允许用户(通过 jQuery)投票赞成或反对特定评论。这就是我实现它的方式。我基本上通过 Ajax/jQuery 调用这个函数,它只通过传递的参数增加评论;我的 cmets 表有 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'];
    }
    

    如果您还有问题,请告诉我

    【讨论】:

    • 请小心这样做,因为在高流量站点上,您可能会同时收到一些请求,这些请求偶尔会覆盖彼此的数据,并且会丢失计数(对于付款等紧急情况,这并不好) .最好使用$this-&gt;Model-&gt;updateAll(['x' =&gt; 'x + 1'], ['id' =&gt; 1]);,这样可以更安全地处理这些情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 2011-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多