cakephpでqueryを使う

小話をひとつ。(誤ってる情報がありましたら修正いたしますので、コメント等いただけるとうれしいです
先日、とあるシステム(made by cakephp 1.2)で今まで一切$model->query()を使わなかったわけだがとうとう解禁で(…というほどでもないけど)管理画面等でかなり複数のテーブルからほしいデータだけを取りたい、という要望があり、そのために$model->query($sql)を使うことになりました。SQLは非常に複雑だったのですが、まあ自由にクエリが書けるだけ色々考えずにすむ!ということでワーイワーイ。

だったわけですが。

テーブルの構造上+データの出力上、unionすることになり、まあそれもクエリ自由にかけますから関係ないですよね、と思ってunionしまして出力してうへへへよかったね。ということで落ち着いたのですが、数日後、unionせずにデータを取得することができることが判明し。クエリを書き直したんですね。でunion消したと。そうしましたら。

おいおい、データがとれないくなったよ^^;実際のクエリをコンソールなりで実行するとデータが取れるわけだが、フレームワーク上では今までとどうも配列の構造がちがうんじゃね?と思って返却されたデータをみておっさん驚いた。全てのデータ(フィールド)が、取得元のテーブルのキー配列に入れ子になっておる。アッ!つまりですね…今まで[0][‘field1’]で取得できていたデータが全て[0][‘table’][‘field1’]という構造になってるよ!えー!というお話。unionしているクエリは全て別名で as ‘hogehoge’と指定しており、そこにテーブル名の記述はないので、すっかり「??どうして?」とてんぱったというお話。今考えると「…まあそうだね」という結論ですけれども。

今回のケースはunionが肝で、データとして別のテーブルから、エイリアスとして同じ名前で設定したフィールドを取得しているため、「どこのテーブルから」という情報が識別できないので、取得時に[0][‘field1’]という形でデータを帰さざるを得なかったわけですが、unionを消したことで取得元のテーブルが明確になり、[0][‘table’][‘field1’]という構造で返却されました、ということでした。で、色々調べてみたんですけど、こちらに1.1系の話がのっていて気になったので自分も同様のソースを参照してみたところcakeの中のソースは同じでした。

というわけで、クエリをじかに書いていて、フィールド名のキーだけでいいんじゃゴルァ!という人はunionつかって空っぽのデータとくっつければいいよって、これちょっと乱暴じゃないか。いや他に良い策があればそれを実行したいのですが。統計情報とかで複雑なクエリを組んだりする場合、あちこちのテーブルからデータを取ってくることって多いと思うんですよね。なもんで、別にモデル名でいちいち判断してくれずに階層を浅くしてほしいな…と思えるシーンもあるんじゃないでしょうか。いちいちテーブルのキー情報で個別に判断するのはちょっとな…と思ったのでした。1.2でのお話です。こんな悩みに遭遇した方いらっしゃいますでしょうか…。

さてさてパフォーマンスチューニングやら、jQueryやら色々やってるわけですがブログが追いつかず悲しい…。最近はflexigridなんか使ってワーワーって感じでやっとります。今これ読んでます。今年は雑種な感じでなんでもあり、でOS本だのサーバ本だのフレームワークだの手当たりしだい読んでます。まだまだです…。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中