2012-02-08 5 views
0

私はcakephp.orgのドキュメントを読んで時間を費やし、様々な実用的な例を試してみました。右。次のように私は3つのテーブルです持っているもの:CakePHP: 'find'条件で2番目の深いモデルの関連付けを使用して、重複した結果を返す

  • プロジェクト
  • project_tags
  • タグ

誰かが新しいプロジェクトを追加するとき、彼らは事前に定義されたリストから選択され、そのタグを選択しますタグテーブル。入力したこのタグは、project_idおよびtag_idフィールドを使用してproject_tagsに格納されます。私は正しい関係はまだ私には自明であるか否かが

  • プロジェクトhasManyのprojectTag
  • projectTag belongsToのプロジェクト
  • ProjectTag belongsToのタグ

モデルとの関係以下の通りです。私はここで数多くの可能性を試しました。

私がやっていることは、特定のタグのすべてのプロジェクトで検索を実行することです。私は、次の手順を実行して、これを行っています

$this->Project->contain(array('ProjectTag' => 'Tag', 'User' => array('id'))); 
$projects = $this->Project->find('all', array('conditions' => array('ProjectTag.tag_id' => '6'))); 

結果は、列ProjectTag.tag_idが存在しないことをSQLエラーです。これは協会に誤りがあることを私に伝えますが、どこで?

これは、Containableを使用しているときに私の好みの状態で2番目の深い関連hasManyモデルを使用できないためですか?もしそうなら、私はこれをどのように修正できますか?

私はそれが長いことを知っています、ごめんなさい。この奇妙な状況に誰かが光を当てることはできますか?

もう1つのアプローチは、プロジェクトのunbindModel()を使用してすべてのバインディングをProjectTagに削除し、次にbindModel()とProjectTag.project_id = Project.idの条件を使用してhasOneを追加しましたが、同じプロジェクトが返され、それぞれのProjectTagに1つずつ表示されますが、正しく表示されません。

私は包含可能な動作を使用しており、AppModelにrecursive = -1を設定しています。

ご協力いただきまして誠にありがとうございます。 ありがとう

答えて

0

は、控えめに言って簡単な作業ではありません。

CakePHPは、hasManyとhasAndBelongsToManyの関連付けごとに別々のクエリを実行するため、検索条件にそれらを含めることが不可能に近くなりました。

私が2倍のソリューションを提示した

1))カスタムクエリのタイプ

2を構築unbindModelとbindModel機能を使用して、私が選んだ

hasOneの

との関連付けを再作成しますポイント2はポイント1が疑問のように思えました(最後の手段として推奨されていました)ので、その場でアソシエーションを変更して後でリセットして、私が意図したように連想させてください。

興味のある人には、belongsToタグという多数のProjectTagを持つモデルプロジェクトがありました。

私は、Project、ProjectTag、TagでunbindModel()メソッドを使用してすべての関連付けを削除し、基本的にすべてのリレーションシップをリンク解除しました。

次に、Project、ProjectTag、TagにbindModel()を適用しました。最も重要なのは、SQL WHERE条件を使用してモデル 'B'にモデル 'A'をリンクすることを可能にする '条件'プロパティを使用したため、これらのバインドを適用した順序(階層)でした。たとえば:

$this->Project->ProjectTag->unbindModel(array(
'belongsTo' => array('Tag') 
)); 

$this->Project->unbindModel(array('hasMany' => array('ProjectTag'))); 

$this->Project->bindModel(array('hasOne' => array('ProjectTag' => array('foreignKey' => false, 'conditions' => array('ProjectTag.project_id = Project.id'))))); 

$this->Project->bindModel(array('hasOne' => array('Tag' => array('foreignKey' => false, 'conditions' => array('Tag.id = ProjectTag.tag_id'))))); 

現在、本質的に関連するプロジェクトを戻しながら、私たちは、タグ上で直接検索条件を適用することができ、それがプロジェクトにhasOneの関係を持っているかのようにTag.idを利用することができます。

問題のモデルで使用されているすべてのリレーションシップをアンバインドすると、破損することがあります。

これは、同じ問題を抱えている人に役立つことを願っています。

+0

"簡単な"と言うと、私はあなたが本当に意味することは "些細ではない"と思います。 – eaj

+0

@eaj - まったく正しい;)updated – SimonDowdles

2

あなたが持っている問題は、あなたがモデルの関係に間違っていたかどうかです。 理想的には、あなたのケースはhasAndBelongsToManyの関係です。

プロジェクトhasAndBelongsToManyのタグ タグhasAndBelongsToManyののproyect

これは、この場合の自然の関係です。 projectTagテーブルはcakephpのモデルではない中間テーブルのみです。詳細については、

:クエリを2+レベルがあなたの検索内関連して深さのモデルを含めるか、ページ付けしようとすると、このポストに遭遇するすべての人へhttp://book.cakephp.org/1.3/view/1044/hasAndBelongsToMany-HABTM

+1

ありがとうございます。フィルタリングの問題は解決しませんでしたが、多くのhasManyバインディングを使用していたところで頭がおかしくなりました。実際にhasAndBelongsTo Manyアソシエーションを単純に使用してもかまいませんでした。 – SimonDowdles

+0

plz、動作していないリンクを更新してください。 – sanjeev

関連する問題