Eksperymentuję z Doctrine ORM (v1.2) dla PHP. Zdefiniowałem klasy "trunek", z dwiema klasami dzieci "gin" i "whisky". Używam dziedziczenia betonu (dziedziczenie tabeli klas w większości literatury) w celu odwzorowania klas na trzy oddzielne tabele bazy danych.PHP doktryna 1.2 ORM - polimorficzne zapytania z dziedziczeniem tabeli klas
Ja próbuje wykonać następujące czynności:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
Początkowo spodziewałem $ ługi być Doctrine_Collection zawierający wszystkie trunki, czy to whisky albo gin. Ale kiedy wykonuję kod, otrzymuję pustą kolekcję, pomimo kilku rzędów w tabelach bazy danych whisky i dżinu. Na podstawie wygenerowanego kodu SQL rozumiem, dlaczego: ORM wysyła zapytanie do tabeli "alkohol", a nie do tabeli whisky/ginu, w której przechowywane są rzeczywiste dane.
Należy zauważyć, że kod działa doskonale, gdy przełączam typ dziedziczenia na agregację kolumn (proste dziedziczenie tabel).
Jaki jest najlepszy sposób uzyskania Doctrine_Collection zawierającego wszystkie trunki?
Aktualizacja
Po kilku dalszych badań, to wygląda jakbym spodziewał Doctrine do wykonywania operacji SQL UNION
za kulisami do łączenia zestawów wyników z „whisky” i stoły „gin”.
Jest to tak zwane zapytanie polimorficzne .
Zgodnie z this ticket ta funkcja nie jest dostępna w Doctrine 1.x. Jest przeznaczony do wydania 2.0. (zobacz także Doctrine 2.0 docs dla CTI).
W świetle tych informacji, jaki byłby najczystszy i najskuteczniejszy sposób obejścia tego problemu? Przejść do dziedziczenia z pojedynczej tabeli? Wykonaj dwa zapytania DQL i ręcznie scalaj wynikowe Doctrine_Collections?