« タブレット用のアプリ群 | トップページ | jQueryUIを使ってドラッグ&ドロップで線を引く »

2015.08.13

Zend DBでは同一カラム名は扱えない

故あって今度はZend Frameworkを扱っている。
CakeもLaravelも中途半端な理解状況なんだが、社の方針なので致し方なし(^^;

その中でちょこっとはまった事例のご紹介。

create_atのようなカラムは複数のテーブルにキーとは関連無くあるわけだが、複数のテーブルにあった場合、Zend DB Adapterでは下記のような感じで取得を行うと思った通りの結果にならなくて焦る。

SELECT * FROM a INNER JOIN b USING(id);
まずもって、"id"列が1つしか出力されない。
さらにA表B表ともにcreate_at,update_atのような時刻カラムを持っているのだが、出力されるcreate_atは1つだけ。

これはSQL実行後の結果を連想配列で保持するという仕様から、必然的にこうなってしまうということだった。
基本的に連想配列が上書きされるので上記のような例だとA表の値が格納された後にB表の値で書き換えられてしまう。INNER JOINで結合したカラムであればどっちの表のデータが採用されても問題はないのだが、主表と従表でデータが生成されたタイミングの違いを見たい、とか行った場合にこれは困ったことになる。

ref)[Zend_Db_Adapter]

select で取得する一覧の中に同名のカラムが含まれている場合 (たとえば複数テーブルを JOIN した場合など) は、その名前のエントリはひとつしか含まれません。 FETCH_ASSOC モードを使用する場合は、 SELECT クエリでカラムの別名を指定するなどして、 結果の配列におけるキーが一意になるようにしなければなりません。
対策も書いてあるとおりでASでのエイリアス指定を行えばよい。
そうなると安易に*で書くことはできないが、もともと*を使うのはあまり推奨されてないので、同一カラム名が出現する場合にはASを使うことが必要、ということである。

ただphpPGadmin的なものにおいてカラムは動的に選択されてしまう要素である。このため別名をコード側で指定することはできない。これについては別の対策を考えないといかんなー。

|

« タブレット用のアプリ群 | トップページ | jQueryUIを使ってドラッグ&ドロップで線を引く »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/62075384

この記事へのトラックバック一覧です: Zend DBでは同一カラム名は扱えない:

« タブレット用のアプリ群 | トップページ | jQueryUIを使ってドラッグ&ドロップで線を引く »