0

Cakephp で適切にクエリを実行するのに問題があります。Cake がテーブルの 1 つで存在しない列を見つけようとしていますが、その理由がわかりません。これには 2 つのテーブルがあります。投票と投稿。ユーザーは投稿に投票できます。

ここにテーブルがあります

Table votes
post_id |  user_id | vote

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

ユーザーが投稿に投票すると、その投票は投票テーブルに配置され、vote_total は投票によって増減します。

投稿のインデックスでは、ユーザーはこれら 2 つのリンクから投稿に投票できます。現在、一方を機能させるためだけに両方を同じ関数に送信しました。その後、もう一方を終了します

<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 がどこからクエリされているのかわからないことです。関数とモデルを検索してきましたが、何が起こっているのかわかりません。

これが私のpostcontroller関数です

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 

これはハズマン関係ではありませんか?各投稿には多くの投票がありますが、各ユーザーは投稿ごとに 1 票しかありません。

4

3 に答える 3

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 に答える
0

CakePHP の規則に従っていてid、すべてのテーブルに含まれていると仮定します。

を呼び出しているので$this->Post->Vote->recursive = 0、CakePHP は にPost関連するすべてを選択しますVote。関係があるためPost hasMany Vote、 を介して投票を選択すると、最初に外部キー$this->Post->Vote->find()がチェックされます。Vote.post_id

次に、 を選択するために、 のようなテーブルに対してPostクエリを実行する必要があります。それはおそらくどこから来ているのでしょう。PostsPost.id = Vote.post_idPost.id

ただし、奇妙に思えるのは、その呼び出しですPost.post_id(モデルをそれ自体に関連付けることはないと思われるため、当然存在しません)。呼び出している可能性のある関数は、まだ呼び出しである可能性がありますが、すべての投稿recursiveをフェッチしようとしています。あなたのアプリケーションがどのようにコーディングされているかはわかりませんが、それをさらに追跡するためのヒントは、それが呼び出されているかどうかを確認することです (データの欠落について心配する必要はありません)。recursive=-1 の後にそのクエリを実行していない場合は、コンポーネント (CakePHP の本を参照) などのより具体的なものを使用してデータを取得してみてください。役立つ場合があります。recursive-1Containable

Post.idこれが役立つかどうかはわかりませんが、行方不明を見たときに頭から飛び出しました。それが機能するかどうか(または機能しないかどうか)教えてください:)

于 2012-08-04T04:17:50.440 に答える
0

とテーブルidの両方にフィー​​ルドが必要です。postsvotes

あなたpostsのテーブルにはpost_idフィールドがありますが、あなたの場合は必要ありません。

したがって、テーブルpost_idから削除して結果を確認します。posts

于 2012-08-04T06:32:23.333 に答える