cakephpについての質問です。現在、cakephpを使ってウェブアプリケーションを開発しております。
そこで、タグ検索(複数タグで検索可能)のようなものを実装しようとし、usersテーブルとtagsテーブル、users_tagsテーブルを作り、Userモデルにhabtm、UsersTagモデルにbelongsToを双方へ設定しています。
そこで、
$this->User->UsersTag->findAll($condition...)
という文で検索しているのですが、$conditionに"UsersTag.tag_id"=>(1,2)とすると、検索結果にユーザーレコードで二つのタグが該当する場合、重複して結果が出てきます。
レベルが低くて申し訳ないのですが、解決法がわかりそうな方がいましたら、よろしくおねがいします。
たぶん、その書き方だと、 1 or 2 になるので、重複して出てくると思います。
ズバリなアルゴリズムの改善ではありませんが、
得た重複データから、
表示時に重複を排除して表示してはどうでしょうか?
とりあえずは、目的の動作を達成できるかな、と思います。
タグシステムについて以前に質問したことがありますが、
非常に参考になる回答をいただきました。
http://q.hatena.ne.jp/1180319649
ユーザーテーブルに、タグテーブルをくっつけて、
そのユーザーテーブルをタグ検索すれば、
重複せずに出てくるのではないかな、と思います。
アソシエーションで、
テーブル同士をうまくつなげてから、
どのテーブルを検索するか、で結果が変わってきます。
アソシエーションは、一時的に指定したり解除したりできるので、
タグ検索時だけ、それようにアソシエーションさせて、
検索させるのも一つの方法かもしれませんね。
たぶん、今は「タグ」から検索してるので、
逆の発想で「ユーザー」に「タグ」をくっつけて検索すれば、
ユーザーレコードは1つしかないはずなので、重複はしないと思います。
cake勉強中なのであまり詳しい回答はできませんが・・・。
なるほど。回答も参照ページもとても参考になります!ありがとうございます!
アソシエーションの変更は現在検討中なのですが、どういう風にアソシエーションを設定すれば実現できるのかが今イチ考えつかず、悪戦苦闘中です。
$this->User->UsersTag->findAll($condition...)を
$this->UsersTag->User->findAll($condition...)のようにすれば良いんでしょうかねえ?
とりあえず試してみます!
コントローラーで、bindModelを使うと一時的にアソシエーションできるので、
検索結果をvar_dumpで表示してみると、
どういう構造になってるかわかるので、いろいろ希望の状態になるよう
試してみるといいと思います。
http://astrodeo.com/blog/archives/154
あとは、直接sqlを発行するのも手ですね。
cakeだからわけわかんなくなるっていうのもありますよね。。
自分は、タグ検索で、
タグ一覧取得時に、同じタグをつけたユーザーが複数いた場合、
同じタグが複数ヒットしてしまうという問題を、
上記、過去の質問URLにある
group by
を使うことで解決しました。
回答ありがとうございます!
そうですか。。表示の改善は考えたのですが、一応ページング処理もしようと思っていたので案から抜いていました。
表示から排除のときに、ページングまでできるようにすることはできるのでしょうか?