2012-08-04 3 views
0

cakephp가 올바르게 쿼리하는 데 문제가 있습니다. Cake는 테이블 중 하나에 존재하지 않는 열을 찾으려고 노력하고 있는데 그 이유를 알 수 없습니다. 나는 이것과 관련된 두 개의 테이블을 가지고있다; 투표 및 게시물. 사용자는 게시물에 투표 할 수 있습니다. 여기 cakephp가 추가 열을 쿼리하고 있는데 이유를 알 수 없습니다.

는 테이블
Table votes 
post_id | user_id | vote 

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

후 자신의 투표에 사용자 투표가 투표 테이블에 배치됩니다

, 그리고 vote_total은 자신의 투표에 의해 감소 ​​/ 증가됩니다.

게시물의 색인에서 사용자는이 두 링크를 통해 게시물에 투표 할 수 있습니다. 내가 게시물을 표시 index.ctp를 볼 때 지금 나는 모두 하나의 작업을 얻을 수있는 동일한 기능을 보낸 후, 나는 다른

<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> 

을 완료거야, 나는 다음과 같은 오류를 얻을

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

여기 그래서, 내 문제는 Post.id가에서 조회되는 어디 모르겠입니다 그것은

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 

을 예비 성형 된 쿼리입니다. 나는 내 기능과 모델을 조사해 왔고 무슨 일이 일어나고 있는지 알 수 없다.

여기에 기능이

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

그래서, 내 질문에 내가 post.id를 조회하는 원인이 케이크 무슨 일을하고있다 내 게시물 모델에서 내가 PostsController

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

입니까? 내 테이블의 열조차도 아니며 쿼리가 어디에서 왔는지 파악할 수 없습니다.

내가 오류를 조회하는 것은 사라지고 내 게시물 모델의 투표에 대한 hasMany의 관계를 제거 할 수 있지만 나는 테이블에 모든 단일 포스트 필드를 참조하는 다음과 같은 오류가 편집.

Undefined index: id 

과장 관계가 아닙니까? 각 게시물에는 다수의 투표가 있지만 각 사용자는 게시물 당 1 개의 투표 만 있습니다.

답변

0

CakePHP 규칙을 따르고 있고 모든 테이블에 id이 있다고 가정합니다.

$this->Post->Vote->recursive = 0을 호출 중이므로 CakePHP는 Vote과 관련된 모든 Post을 선택합니다. Post hasMany Vote 관계가 있으므로 $this->Post->Vote->find()을 통해 투표를 선택하면 먼저 Vote.post_id 외래 키를 확인합니다.

그런 다음 Post을 선택하려면 과 같은 내용의 Posts 테이블에 대한 쿼리를 실행해야합니다. 그게 아마도 Post.id이 올 곳일 것입니다.

이상하게 보일지라도 Post.post_id이라는 호출이 있습니다 (실제로는 존재하지 않습니다. 모델을 연결하지 않을 것이라고 가정하므로). 호출 할 가능성이있는 함수는 여전히 recursive 호출 일 수 있지만 모든 게시물을 가져 오려고합니다. 귀하의 응용 프로그램이 코딩 된 방법을 알지 못하지만 그 이상을 추적 할 수있는 팁은 recursive-1으로 바꾸고 이것이 불려지는지 확인하십시오 (누락 된 데이터는 걱정하지 마십시오). recursive = -1 후에 Query를 실행하지 않는다면, Containable Component (CakePHP 's Book 참조)와 같은 좀 더 구체적인 것을 사용하여 데이터를 가져 오십시오. 도움이 될 것입니다.

내가 도움이 될지 모르겠다. 단지 Post.id이 누락되었을 때 머리에서 튀어 나왔다. 내가 그것을 작동하는지 알 (여부) 주시기 바랍니다 :)

+0

-1로 변경했는데 아무 것도 변경되지 않았습니다. 나는 containable 정보를 조사했지만 아무 일도 없었다고 생각하지 않습니다. – user1406951

0

가이 일을보십시오 : 두 postsid 필드가 필요

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

:

귀하의 게시물 데이터가 올바른 형식이되지 않습니다 및 votes 테이블.

그리고 posts 테이블에는 post_id 필드가 있지만, 필요하지 않습니다.

따라서 post_id 테이블을 posts 테이블에서 제거하고 결과를 확인하십시오.

+0

나는 그것과 관련이 있다고 생각하지만, 모델의 관계가 꺼져 있다고 느낍니다. 내 게시물 및 투표 테이블에서 post_id를 id로 변경하면 cake는 votes.post_id를 쿼리합니다. 나는 그들에게 양쪽 테이블의 post_id를 설정할 때 votes.id에 대한 cake 쿼리를 할 것이다. – user1406951

관련 문제