0

我在让 cakephp 正确查询时遇到了一些麻烦。Cake 试图在我的一张桌子上找到一个不存在的列,但我不知道为什么。我有两个表与此有关;投票和帖子。用户可以对帖子进行投票。

这是表格

Table votes
post_id |  user_id | vote

table posts
post_id | tite | body | created | modified  | user_id | vote_total

当用户对帖子进行投票时,他们的投票将被放置在投票表中,并且 vote_total 会根据他们的投票而增加/减少。

在帖子索引中,用户可以通过这两个链接对帖子进行投票。现在我都发送到同一个函数只是为了让一个工作,然后我会完成另一个

<td><?php echo $this->Html->link('Upvote', array('action' => 'vote', $post['Post']['id']))?>
    <?php echo $this->Html->link('Downvote', array('action' => 'Downvote', $post['Post']['id']));?></td>

当我查看显示帖子的 index.ctp 时,出现以下错误

Error: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'Post.id' in 'field list'

这是它正在执行的查询

SQL Query: SELECT `Post`.`post_id`, `Post`.`title`, `Post`.`body`, `Post`.`created`, `Post`.`modified`, `Post`.`user_id`, `Post`.`vote_total`, `Post`.`id` FROM `blog`.`posts` AS `Post` WHERE 1 = 1

所以,我的问题是我不知道从哪里查询Post.id。我一直在搜索我的功能和模型,但我无法弄清楚发生了什么。

这是我的帖子控制器的功能

public function vote($id=null){ 
$this->layout = 'votes_layout';
$this->Post->Votes->recursive = 0;

$this->Post->id = $id;
$user = $this->Auth->User();
$userid = $user['id'];
$conditions = array('votes.id' => $id, 'votes.user_id' => $userid);

$data = $this->Post->Votes->find('all', array('conditions' => $conditions));

if (isset($data) && !empty($data)) {
    echo '<p>User have already give a vote!</p>';
} else {

    if($this->Post->Votes->validates()){

        if ($this->Post->Votes->save($this->request->data)) {
                $this->Session->setFlash(__('The vote has been saved'));
                $this->redirect(array('action' => 'vote'));
        } else {
                $this->Session->setFlash(__('The vote could not be saved. Please, try again.'));
        }
    }   
}
}

这是在我的帖子模型中

 public $hasMany = array(
    'Votes' => array(
        'className'  => 'Vote',
        )
    );

所以,我的问题是我在做什么导致蛋糕查询 post.id?它甚至不是我表中的一列,我无法弄清楚查询的来源。

编辑

当我在我的 Posts 模型中删除投票的 hasMany 关系时,查询错误消失了,但是我有以下错误,它引用了表中的每个帖子字段。

Undefined index: id 

这不是hasmany关系吗?每个帖子都有很多投票,但每个用户每个帖子只有一票。

4

3 回答 3

0

您需要id在两个表posts中都有字段。votes

在你的posts表中你有post_id字段,但你的情况没有必要。

因此,post_idposts表中删除并检查结果。

于 2012-08-04T06:32:23.333 回答
0

假设您遵循 CakePHP 约定并且id在您的所有表中都有。

由于您正在调用$this->Post->Vote->recursive = 0,CakePHP 将选择所有Post与您的Vote. 由于您有Post hasMany Vote关系,当它通过 选择投票时$this->Post->Vote->find(),它将Vote.post_id首先检查外键。

然后,为了选择Post,它必须在Posts表上运行类似的查询Post.id = Vote.post_id。这可能就是它的Post.id来源。

不过看起来很奇怪的是它的调用Post.post_id(它自然不存在,因为我假设你不会将模型与自身关联)。可能正在调用的函数可能仍然是recursive调用,但是它正在尝试获取所有帖子。我不知道您的应用程序是如何编码的,但是提示您进一步跟踪的提示将转向recursive-1查看是否调用了它(不要担心丢失数据)。如果它在 recursive=-1 后没有运行该查询,那么尝试使用更具体的东西,如Containable组件(参见 CakePHP 的书)来获取您的数据 - 这可能会有所帮助。

我不确定这是否会有所帮助,当我看到Post.id失踪时,我突然想到了。请让我知道它是否有效(或无效):)

于 2012-08-04T04:17:50.440 回答
0

试试这个东西:

您的帖子数据格式不正确:

$data = array('post_id'=>$id,'user_id'=>$userid);

if ($this->Post->Votes->save($data)) {
            $this->Session->setFlash(__('The vote has been saved'));
            $this->redirect(array('action' => 'vote'));
    } else {
            $this->Session->setFlash(__('The vote could not be saved. Please, try again.'));
    }
于 2012-08-04T05:40:02.660 回答