2011-11-09 10 views
5

W mojej aplikacji mam wiele prostych tabel bazy danych odniesienia/odnośników używanych do dostarczania listy dozwolonych wartości w powiązanej tabeli.Unikanie sprzężeń z tabelami referencyjnymi/odnośnikami w Doctrine 2

(Wiesz, tabela A „krajów” ma listę krajów, które są dopuszczalne w polu „kraj” stołu Adres ...)

Aby utrzymać mojego modelu danych jak chude jak to możliwe, użyj "Bill Karwin technique" pomijania kolumny "id" w tabeli odnośników i używając rzeczywistej wartości jako klucza podstawowego. W ten sposób nie musisz robić sprzężenia, aby uzyskać wartość w głównej tabeli, ponieważ jest już tam jako klucz obcy.

Problem polega na tym, że Doctrine używa odwołań do obiektów dla wszystkich powiązań, co oznacza, że ​​zapytania nadal wymagają dołączenia do tabel odnośników - nawet wtedy, gdy tabela główna ma już potrzebne wartości.

Na przykład, zapytanie to nie działa:

$qb->select(array('a.id', 'a.street', 'a.city', 'a.country')) 
    ->from('Entity\Address', 'a'); 

Zamiast tego, trzeba to zrobić:

$qb->select(array('a.id', 'a.street', 'a.city', 'c.country')) 
    ->from('Entity\Address', 'a') 
    ->join('a.country', 'c'); 

W przeciwnym razie pojawi się ten błąd:. „Nieprawidłowy PathExpression Musi być StateFieldPathExpression . "

Dodaj wszystkie sprzężenia potrzebne do tabel odnośników, a w moich zapytaniach jest mnóstwo niepotrzebnych kosztów.

Czy ktoś zna dobry sposób na uniknięcie konieczności wykonywania sprzężeń do tabel odnośników/odnośników w Doctrine 2?

(PS - Wolałbym unikać wyliczenia, jak oni not supported by Doctrine i mają inne well-documented disadvantages.)

Odpowiedz

6

Tak, to jest do bani, ale myślę, że miał dobry powód, by to zrobić, że droga.

Możesz użyć podpowiedzi HINT_INCLUDE_META_COLUMNS. Będzie zawierał wszystkie pola w wyniku zapytania, w tym klucze obce, które są odwzorowane jako relacje.

$query = \Doctrine::em()->createQuery($queryString) 
    ->setParameters($params) 
    ->setHint(\Doctrine\ORM\Query::HINT_INCLUDE_META_COLUMNS, TRUE); 

Więc jeśli masz pole city_id w tabeli w db Address, to będzie również emitowany w wyniku zapytania, wraz ze „standardowym” relacji miasta.

+0

To jest wspaniałe - nie wiedziałem o metodzie setHint() i nie planowałem jej dobrze wykorzystać. – cantera

+1

Ustaw wskazówkę jest używana do wszystkich rodzajów rzeczy, nie tylko do dołączania meta kolumn. Jest to sposób na dołączenie chodzącego po zapytaniu, który wykonuje przy każdym zapytaniu. Możesz także tworzyć własne wskazówki, które robią, co chcesz. Przyjemne maleństwo to nie to;) – ZolaKt

+0

Ostrzeżenie: Doctrine nie zawiera kluczy obcych z pustym hasłem. Na przykład, jeśli city_id nie jest obowiązkowe, to nie będzie zawsze obecne. Po prostu spędź na tym 2 godziny, myśląc, że to problem z pamięcią podręczną :) –