複数のテーブルをまたぐ抽出条件

こうやってカテゴリーが増えていくんですね。
最近cakeばっかりです。超一流のプログラマーをwizardと言ったり言わなかったりするそうですが、cakeを極めるとパティシエと呼ばれるんでしょうかね?


さて、cakePHPのfindのお話。
conditionsに色々と抽出条件を書きますが、アソシエーションを組んだ場合で、連結先のフィールドに対して絞り込むときの考え方。

belongsToやhasOneしてあるモデルに対しては普通にconditionsに書けばいい。SQL実行時にこれらはLEFT JOINされるので問題なく使える。



じゃぁ、hasManyとHABTMは?

相手先のidを取ってきてから、中間テーブルをhasOneで繋ぎ直して、使うとか……。かなり難解。ある程度動きを追える状態じゃないとハマりそうですね。


更にその先にあるテーブルに条件を設定したい場合は?
実はfindで全部持ってきてから再度しぼり込むような感じになります。中心となるテーブルを見直すなどして、ちゃんと絞り込めるようにしましょう。


で、一つの解決策として、viewを使うという手もあります。

db上にviewを作って、それに対応したモデルを使って、絞り込めるようにしてみようというアイデア。外部キー周りがデフォルトの命名規則から外れてしまうが、案外スムーズに期待した結果がとれた。


viewって

  • SQLがキャッシュされると高速化が期待できる
    • ただし、結合とか変な絞り込みとか掛けると逆に劣化しそう
  • 保守性の低下
    • スキーマや仕様の変更などに伴うviewの変更。これ忘れるんだよね。

特徴を理解して使いましょう。