2012-08-30 15 views
5

mam następujące dwie tabele:Automatyczne wygładzanie PDO podczas pobierania?

foo:

ID  NUMBER(38) 
DATA VARCHAR2(10) 

bar:

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

Podczas korzystania PDO wydać następujące zapytanie:

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

Czy istnieje sposób na odzyskanie wszystkich kolumn z łączenia w formie automatycznego wyrównania (np. "FOO.ID", "FOO.DATA", "BAR.ID", itp.), Aby nie trzeba było podawać i podawać wszystkich kolumn w zapytaniu?

Przeczytałem całą dokumentację różnych fetch modes i eksperymentowałem z większością flags/options, ale nadal nie mogę znaleźć tego, czego szukam.

Aktualizacja:

Korzystanie PDO::FETCH_ASSOC, kolumny od foo wydają się być nadpisane przez kolumny z bar:

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

Korzystanie PDO::FETCH_NUM, kolumny z obu foo i bar pojawiają , ale bez żadnego sposobu na określenie, które kolumny pochodziły z jakich tabel, chyba że znają zdrętwiałe er kolumn w każdej tabeli i dokładnej kolejności tych kolumn (podatne na błędy):

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

Korzystanie PDO::FETCH_BOTH, że pozornie napotkasz tymi samymi problemami jak PDO::FETCH_ASSOC i PDO::FETCH_NUM połączeniu i stworzyć strasznie niezrozumiale zestaw wyników:

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" 
} 

Idealnie, zestaw wynik powinien wyglądać podobnie do tego:

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

Zawsze możesz odnieść się do kolumny z jej kwalifikowaną nazwą 'tableName.columnName', jeśli tak, to co miałeś na myśli (nie jest to alias). – KingCrunch

+0

W każdym razie dobrze jest wejść do jawnej listy kolumn w wybranych zapytaniach zamiast "SELECT *". –

+0

@MichaelBerkowski: Niestety, nie mam tego luksusu w tym przypadku. – FtDRbwLXw6

Odpowiedz

1

Wydaje się, że nie sposób to zrobić za kurtyną. Wyraźne aliasingowanie jest jedynym sposobem.

2

Nie, nie można, przynajmniej trzeba zrobić:

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

Wydaje się, że nie daje to pożądanego rezultatu w PDO. Żaden z kluczy podczas pobierania nie jest oznaczony jako "f.id" lub podobny. Wydaje się, że faktycznie nadpisuje nieliczbowe klucze i tworzy naprawdę dziwne zestawy wyników. – FtDRbwLXw6

0

spróbuj tego:

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

chodzi o to, aby zmienić tylko sprzeczne atrybuty tak, że nie ma więcej konfliktów.

Powiązane problemy