2012-08-30 8 views
5

私は次の2つの表があります。PDOフェッチ時の自動エイリアシング?

SELECT * FROM foo f INNER JOIN bar b ON (f.id = b.foo_id) 
:次のクエリを発行する PDOを使用する場合

ID  NUMBER(38) 
FOO_ID NUMBER(38) 
DATA VARCHAR2(10) 

FOO:

ID  NUMBER(38) 
DATA VARCHAR2(10) 

バー

戻す方法はありますか?すべてのの列は、結合からの何らかの種類の自動エイリアス形式(例: "FOO.ID"、 "FOO.DATA"、 "BAR.ID"など)を使用して、クエリ内のすべての列を指定したりエイリアスする必要はありません。

fetch modesのドキュメントをすべて読んで、flags/optionsのほとんどを試しましたが、まだ私が探しているものが見つからないようです。

更新:PDO::FETCH_ASSOCを使用して

fooから列がbarから列によって上書きされているように見える:PDO::FETCH_NUMを使用して

array(3) { 
    ["ID"]=> 
    string(1) "1" 
    ["DATA"]=> 
    string(5) "bar 1" 
    ["FOO_ID"]=> 
    string(1) "1" 
} 

foobar両方の列が表示されます、順番に、ただし、どの列がどのテーブルから来たのかを特定することはありません。ただし、各テーブル内の列のERおよびそれらの列の正確な順序(エラープローン):PDO::FETCH_BOTHを使用

array(5) { 
    [0]=> 
    string(1) "1" 
    [1]=> 
    string(5) "foo 1" 
    [2]=> 
    string(1) "1" 
    [3]=> 
    string(1) "1" 
    [4]=> 
    string(5) "bar 1" 
} 

は、我々は、一見PDO::FETCH_ASSOCと組み合わせPDO::FETCH_NUM同じ問題に実行し、恐ろしく不明瞭結果セットを作成します。

array(8) { 
    ["ID"]=> 
    string(1) "1" 
    [0]=> 
    string(1) "1" 
    ["DATA"]=> 
    string(5) "bar 1" 
    [1]=> 
    string(5) "foo 1" 
    [2]=> 
    string(1) "1" 
    ["FOO_ID"]=> 
    string(1) "1" 
    [3]=> 
    string(1) "1" 
    [4]=> 
    string(5) "bar 1" 
} 

理想的には、結果セットは次のようになります。

array(5) { 
    ["FOO.ID"]=> 
    string(1) "1" 
    ["FOO.DATA"]=> 
    string(5) "foo 1" 
    ["BAR.ID"]=> 
    string(1) "1" 
    ["BAR.FOO_ID"]=> 
    string(1) "1" 
    ["BAR.DATA"]=> 
    string(5) "bar 1" 
} 
+0

名前が 'tableName.columnName'の修飾名であれば、いつでも参照することができます(これは別名ではありません)。 – KingCrunch

+0

「SELECT *」ではなく、SELECTクエリで明示的に列を列挙するのは良い習慣です。 –

+0

@MichaelBerkowski:残念ながら、私はこの事例では贅沢はありません。 – FtDRbwLXw6

答えて

1

カーテンの後ろにこれを実行する方法はないように見えます。明示的なエイリアシングが唯一の方法です。

2

いいえ、あなたは、少なくともあなたがする必要があることはできません。

SELECT f.*, b.* FROM foo f INNER JOIN bar b ON (f.id = b.foo_id) 
+0

これはPDOで望ましい結果を出すようには思われません。フェッチするときにキーのどれも 'f.id'またはそれに類するものとラベル付けされていません。実際には、非数値キーを実際に上書きして、実際には奇妙な結果セットを生成するようです。 – FtDRbwLXw6

0

はこれを試してみてください。

SELECT f.ID as fID, f.DATA as fDATA, b.*, FROM foo f INNER JOIN bar b ON (f.id = b.foo_id) 

アイデアがもう競合がないようにだけ相反する属性を変更することです。

関連する問題