cakephpのアソシエーションの検索(複数タグでの検索)で結果が重複


cakephpについての質問です。現在、cakephpを使ってウェブアプリケーションを開発しております。
そこで、タグ検索(複数タグで検索可能)のようなものを実装しようとし、usersテーブルとtagsテーブル、users_tagsテーブルを作り、Userモデルにhabtm、UsersTagモデルにbelongsToを双方へ設定しています。

そこで、
$this->User->UsersTag->findAll($condition...)
という文で検索しているのですが、$conditionに"UsersTag.tag_id"=>(1,2)とすると、検索結果にユーザーレコードで二つのタグが該当する場合、重複して結果が出てきます。

レベルが低くて申し訳ないのですが、解決法がわかりそうな方がいましたら、よろしくおねがいします。

回答の条件
  • 1人5回まで
  • 登録:2008/07/29 16:36:32
  • 終了:2008/08/05 16:40:02

回答(3件)

id:onigirin No.1

onigirin回答回数327ベストアンサー獲得回数232008/07/30 15:22:03

ポイント27pt

たぶん、その書き方だと、 1 or 2 になるので、重複して出てくると思います。


ズバリなアルゴリズムの改善ではありませんが、

得た重複データから、

表示時に重複を排除して表示してはどうでしょうか?


とりあえずは、目的の動作を達成できるかな、と思います。

id:lemolemo75

回答ありがとうございます!

そうですか。。表示の改善は考えたのですが、一応ページング処理もしようと思っていたので案から抜いていました。

表示から排除のときに、ページングまでできるようにすることはできるのでしょうか?

2008/07/30 19:17:09
id:onigirin No.2

onigirin回答回数327ベストアンサー獲得回数232008/07/30 19:46:06

ポイント27pt

タグシステムについて以前に質問したことがありますが、

非常に参考になる回答をいただきました。

http://q.hatena.ne.jp/1180319649


ユーザーテーブルに、タグテーブルをくっつけて、

そのユーザーテーブルをタグ検索すれば、

重複せずに出てくるのではないかな、と思います。

アソシエーションで、

テーブル同士をうまくつなげてから、

どのテーブルを検索するか、で結果が変わってきます。

アソシエーションは、一時的に指定したり解除したりできるので、

タグ検索時だけ、それようにアソシエーションさせて、

検索させるのも一つの方法かもしれませんね。


たぶん、今は「タグ」から検索してるので、

逆の発想で「ユーザー」に「タグ」をくっつけて検索すれば、

ユーザーレコードは1つしかないはずなので、重複はしないと思います。


cake勉強中なのであまり詳しい回答はできませんが・・・。

id:lemolemo75

なるほど。回答も参照ページもとても参考になります!ありがとうございます!

アソシエーションの変更は現在検討中なのですが、どういう風にアソシエーションを設定すれば実現できるのかが今イチ考えつかず、悪戦苦闘中です。

$this->User->UsersTag->findAll($condition...)を

$this->UsersTag->User->findAll($condition...)のようにすれば良いんでしょうかねえ?

とりあえず試してみます!

2008/07/30 20:15:34
id:onigirin No.3

onigirin回答回数327ベストアンサー獲得回数232008/07/31 15:34:17

ポイント26pt

コントローラーで、bindModelを使うと一時的にアソシエーションできるので、

検索結果をvar_dumpで表示してみると、

どういう構造になってるかわかるので、いろいろ希望の状態になるよう

試してみるといいと思います。

http://astrodeo.com/blog/archives/154


あとは、直接sqlを発行するのも手ですね。

cakeだからわけわかんなくなるっていうのもありますよね。。


自分は、タグ検索で、

タグ一覧取得時に、同じタグをつけたユーザーが複数いた場合、

同じタグが複数ヒットしてしまうという問題を、

上記、過去の質問URLにある

group by

を使うことで解決しました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません