1

タイトルにあるように、find-queryでの結合に問題があり、次のようなエラーが表示されます。

  preg_match() expects parameter 2 to be string, array given [CORE/cake/libs/model/behaviors/containable.php, line 301]

joinsあそこのアレイに追加しようとしましたが、何も変わりませんでした。

これらは、findメソッドに渡すオプションです。

$options = array(
   'contain' => array(
      'Answer' => array(
         'conditions' => array('Answer.type' => 'answer'),
         'joins' => array(
            $this->votesJoin()
         ),
         'Comment' => array(
            'conditions' => array('Comment.type' => 'comment'),
            'joins' => array(
               $this->votesJoin()
            )
         )
      ),
      'Comment' => array(
         'conditions' => array('Comment.type' => 'comment'),
         'joins' => array(
            $this->votesJoin()
         )
      ),
      'User',
      'Tag' => array()
   ),
   'joins' => array(
      $this->votesJoin()
   ),
   'conditions' => array(
      'Question.id' => $id
   )
);

return $this->find('first', $options);

次の配列をvotesJoin()返します。

(
   [table] => (SELECT Vote.node_id, SUM(value) as total FROM votes AS `Vote`   WHERE 1 = 1  GROUP BY `Vote`.`node_id`  )
   [alias] => Vote
   [conditions] => Vote.node_id = Question.id
)

私がやろうとしていること:各ユーザーはノードに賛成/反対票を投じることができます(質問/回答/コメント)。参加して、私はそれらの投票の合計を追加しようとしています。 データベースhttp://github.com/navale/QA/wiki/img/datamodel.png

4

1 に答える 1

1

"結合" は、Cake モデルの関係と Containable では実行できないことに対してのみ使用する必要があります。あなたのデータベースの詳細はわかりませんが、検索操作は簡略化できると思います。これらのテーブルのスキーマをここに投稿してみませんか?

これを試して:

$options = array(
'contain' => array(
  'Answer' => array(
     'conditions' => array('Answer.type' => 'answer'),
     'Vote' => array(
        'fields' => array('SUM(Vote.value)'),
        'group'  => array('Vote.parent_id')
     ),
     'Comment' => array(
        'conditions' => array('Comment.type' => 'comment'),
        'Vote' => array(
                        'fields' => array('SUM(Vote.value)'),
                        'group'  => array('Vote.parent_id')
                 )
     )
  ),
  'Comment' => array(
     'conditions' => array('Comment.type' => 'comment'),
     'Vote' => array(
        'fields' => array('SUM(Vote.value)'),
        'group'  => array('Vote.parent_id')
     )
  ),
  'User',
  'Tag' => array()

), '条件' => array( 'Question.id' => $id ) );

各回答、コメント、および回答に対するコメントの投票合計値を取得します。(まだ行っていない場合は、Node モデルに 'hasMany' Vote を追加する必要があるかもしれません)

代わりに、質問の投票の合計を 1 つ取得したい場合は、質問の回答とコメントのリストを取得することをお勧めします。

$lvl1 = find('list','fields'=>array('id'),'conditions'=>array('Node.parent_id'=>$id))

次に、回答のコメントのリストを取得します

$lvl2 = find('list','fields'=>array('id'),'conditions'=>array('Node.parent_id'=>$lvl1))

次に、2つの配列を結合してから、それを合計します。

于 2011-07-15T04:40:04.440 に答える