人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

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

●質問者: lemolemo75
●カテゴリ:インターネット ウェブ制作
✍キーワード:CakePHP USER アソシエーション アプリケーション ウェブ
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● onigirin
●27ポイント

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


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

得た重複データから、

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


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

◎質問者からの返答

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

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

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


2 ● onigirin
●27ポイント

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

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

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


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

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

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

アソシエーションで、

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

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

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

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

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


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

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

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


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

◎質問者からの返答

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

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

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

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

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


3 ● onigirin
●26ポイント

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

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

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

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

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


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

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


自分は、タグ検索で、

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

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

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

group by

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ