1

2 つのモデルをリンクすると、次のような結果が返されます。

Array
(
    [Submission] => Array
        (
            [id] => 47
            [user_id] => 0
            [title] => asdfasdfsa dfasdf asdfa sfa fadf
            [source] => http://www.aol.com
            [slug] => 
            [category] => health
            [created] => 2012-06-25 11:30:16
        )

    [User] => Array
        (
            [id] => 2
            [username] => john
        )

    [SubmissionsVote] => Array
        (
            [0] => Array
                (
                    [id] => 247
                    [user_id] => 2
                    [submission_id] => 47
                    [vote_type] => up
                )

        )

)

ただし、投票数が [0] ~ [n] の場合もあります。これは私のもの$newestSubmissionsです。私が私に与えるためにやっているクエリは次のとおりです。

public function newestSubmissions() {
    $this->unBindModel(
            array('hasMany' => array('Comment')));
    return $this->find('all', array(
                'fields' => array(
                    'Submission.id',
                    'Submission.user_id',
                    'Submission.title',
                    'Submission.source',
                    'Submission.slug',
                    'Submission.category',
                    'Submission.created',
                    'User.id',
                    'User.username'
                ),
                'order' => 'Submission.created DESC'
            ));
}

私がやりたいのは、$newestSubmissions配列オブジェクト全体のすべての投票と、それぞれのすべての投票 (以下のクエリ)を取得して、実際のスコアを計算し、代わりにビューに$newestSubmissions呼び出された単一の配列オブジェクトを送信できるようにすることです。$newestSubmissions$newestSubmissions$submissionScore

public function getVoteType($userId, $submissionId) {
    $voteType = $this->find('all', array(
        'conditions' => array(
            'User.id' => $userId,
            'Submission.id' => $submissionId),
        'fields' => array(
            'SubmissionsVote.vote_type'),
        'limit' => '1'
            ));
    return $voteType[0]['SubmissionsVote']['vote_type'];
}

基本的に、親配列オブジェクト内の内部インデックス付き配列オブジェクトを送信するのではなく、配列オブジェクト内の他のすべての情報と共に単一のスコアをビューに送信したいと考えています (これは現在取得しているものです)。

これどうやってするの?

4

2 に答える 2

0
  return $this->find('all', array(
                'fields' => array(
                    'Submission.id',
                    'Submission.user_id',
                    'Submission.title',
                    'Submission.source',
                    'Submission.slug',
                    'Submission.category',
                    'Submission.created',
                    'User.id',
                    'User.username',
                    'submissionsvotes.vote_type'
                ),
                'joins' => array(
                            array(
                            'table' => 'SubmissionsVote',
                            'alias' => 'submissionsvotes',
                            'type' => 'LEFT', 
                            'conditions' => array
                            ('User.id = SubmissionsVotes.user_id','Submission.id'=>'SubmissionsVotes.submission_id')
                            ),
                        )


               'group'=>'submissionsvotes.vote_type',
               'order' => 'Submission.created DESC'
            )
    );
于 2012-08-11T09:17:01.003 に答える
0

わかりました...これをコメントとして投稿しようとしましたが、長すぎました。それは本当にそのような答えではありません。

収容可能な行動について知っていますか?確認してください - 返されるデータを判断するのに適しています: http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html

また、提出票投票テーブルを 2 つのテーブル (賛成票と反対票) に分割する場合は、Cake の counterCache 動作を使用して、「提出物」テーブルで直接、賛成票と反対票の数を追跡することもできます (必要になるでしょう)。 upvote_count 列と downvote_count 列を送信テーブルに追加してください)。

これにより、提出スコアの計算が簡単になります。また、毎回データベースからすべての投票を取得する必要もありません。doco については、このページで counterCache を検索してください: http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html検討する価値があるかもしれません。

于 2012-08-11T08:36:41.730 に答える