Избегание присоединений к справочным / поисковым таблицам в Doctrine 2 - PullRequest
5 голосов
/ 09 ноября 2011

В моем приложении есть несколько простых таблиц справочной / справочной базы данных, используемых для предоставления списка разрешенных значений в связанной таблице.

(Вы знаете, в таблице «Страны» есть список стран, которые разрешены в поле «страна» таблицы адресов ...)

Чтобы моя модель данных была как можно более компактной, я использую " технику Билла Карвина * ", чтобы пропустить столбец 'id' в таблице поиска и просто использовать фактическое значение в качестве первичного ключа. Таким образом, вам не нужно выполнять объединение, чтобы получить значение в основной таблице, поскольку оно уже существует в качестве внешнего ключа.

Проблема в том, что Doctrine использует ссылки на объекты для всех ассоциаций, что означает, что запросы все еще требуют присоединений к таблицам поиска - даже если в основной таблице уже есть нужные мне значения.

Например, этот запрос не работает:

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

Вместо этого вы должны сделать это:

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

В противном случае вы получите эту ошибку: «Неверное выражение пути. Должно быть выражением StateFieldPathExp.»

Сложите все объединения, необходимые для справочных таблиц, и в моих запросах много лишних затрат.

Кто-нибудь знает хороший способ избежать необходимости выполнять объединения с справочными / справочными таблицами в Doctrine 2?

(P.S. - Я бы предпочел избегать использования ENUM, так как они не поддерживаются Doctrine и имеют другие хорошо задокументированные недостатки .)

1 Ответ

6 голосов
/ 12 марта 2012

Да, это отстой, но я думаю, у них была веская причина для этого.

Вы можете использовать подсказку HINT_INCLUDE_META_COLUMNS.Он будет включать в себя все поля в результате запроса, включая внешние ключи, которые отображаются как отношения.

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

Таким образом, если у вас есть поле city_id в таблице Address в БД, оно также будет выведено в результате запроса вместе со "стандартным" отношением City.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...