CakePHPのfind()メソッドと「より深い」モデルの関連付けに問題があります。これらの中にはいくつかのものがありますが、私はこれまでこれに対する答えを見つけることができませんでした。Model-> find()(CakePHP)を使用した関連モデルの条件
私のモデルの関連付けはそれぞれUser hasMany Post hasMany Comment hasMany Vote
とVote belongsTo Comment belongsTo Post belongsTo User
です。 belongsTo
アソシエーションは内部結合を使用します( 'type' => 'INNER')。
CakePHPのmodel-> find()メソッドを使って、特定のユーザーの投稿に対するコメント投票をすべて見つけるにはどうすればよいですか?
私は4モデルのチェーンを意図的に使用しました。これは、直接関連付けられたモデルの条件で動作するように思われるためです。したがって、隣接するテーブルには外部キー保持列を使用しません( 'User.id == 1'の代わりに 'Post.user_id == 1'という条件)。
SQLでは、これは次のようになります。
SELECT v.*
FROM votes v
JOIN comments c ON (v.comment_id = c.id)
JOIN posts p ON (c.post_id = p.id)
JOIN users u ON (p.user_id = u.id)
WHERE u.id = 1
が、私はこれらを検索()+収容可能振る舞いを使用して参加し再現することができません。私は単純に彼のすべてのデータを持つユーザーを得ることができますが、結果の配列内からすべての投票を収集する必要があります。
それはこのように動作していません(警告:不明な列 'User.idを'):
$this->Vote->recursive = 2; // or higher
$this->Vote->find('all',array('conditions' => array('User.id' => 1)));
実際には、これでも代わりに、ユーザーのポストを使用して動作しません(Vote-> COMMENT->私が条件を加えるとすぐに)。製造されたSQLクエリは投票とコメントにのみ参加します。
返される配列には、上記のSQLクエリが返す票しか含まれていない必要があります。他のすべては、プロセスで「結合され」なければなりません。
注: In cakephp how can I do a find with conditions on a related field?
複数のbelongsToを避ける理由はありますか? – cp3
投票テーブルに外部キー列user_idがあり、ユーザーと投票を直接関連付けることを意味しますか?それは少し冗長で、私のスキーマに循環関係を作成するようです。 "それは"それは私が推測することができると述べた。または、私はあなたが複数のbelongsToの意味を誤解していますか?そうであれば、Vote belongsTo Userのアソシエーションを明示的に追加し、コメントと投票を「通過」するように設定することは可能ですか? – Wolfram
別のテーブルを使用して関連付けられているすべてのテーブルに外部キーを追加すると、冗長すぎることになります。 – BWelfel