
CakePHPアプリのモデルにおいて、UserBookモデルとBookモデルがあり、主キーは両方ともID。しかし両テーブルともASINというフィールドを持っていて、ASINフィールドを用いてJOINしたい場合のTips。
テーブルの意味的にはUserBook(user_books)テーブルがユーザが持っているテーブル、Book(books)テーブルが書籍情報を管理するテーブル。
テーブル構成としては
| Book | UserBook | |
|---|---|---|
| id(主キー) | id(主キー) | |
| asin | ⇔ | asin |
| その他 | その他 |
となっています。
UserBook側からBookに対してASINフィールドでJOINした結果を取得するためには、UserBookモデル側に
でOK。
なにをしているかというと、findAll関数のラッパークラスfindAllWithBookで、primaryKeyを「asin」にしてからBookモデルと外部キー「asin」でbindModel、その後unbindModelをし、主キーをidに戻しています。
これで
としてasinフィールドでJOINした結果が取得できます。
※この場合、UserBookモデルにbelongsToなどのidを対象にJOINする関連付けがなされている場合おそらく「asin」フィールドに対してJOINするクエリを発行してしまうので注意して下さい。
こういった細かいことをする場合はやはり直接クエリを記述した方がいい様な気もします。。もしくは上記の例ですとUserBookテーブルにbook_idフィールドを作成するべきでしょうか。