Я экспериментирую с Doctrine ORM (v1.2) для PHP. Я определил класс "ликер", с двумя дочерними классами "джин" и "виски". Я использую конкретное наследование (наследование таблицы классов в большинстве литературы) для сопоставления классов с тремя отдельными таблицами базы данных.
Я пытаюсь выполнить следующее:
$liquor_table = Doctrine_Core::getTable('liquor');
$liquors = $liquor_table->findAll();
Вначале я ожидал, что $ликеры станут Доктриной_Коллекцией, содержащей все ликеры, будь то виски или джин. Но когда я выполняю код, я получаю пустую коллекцию, несмотря на наличие нескольких строк в таблицах базы данных виски и джина. Основываясь на сгенерированном SQL, я понимаю, почему: ORM запрашивает таблицу "ликер", а не таблицы виски/джина, где хранятся фактические данные.
Обратите внимание, что код отлично работает, когда я переключаю тип наследования на агрегацию столбцов (простое наследование таблицы).
Какой лучший способ получить Doctrine_Collection, содержащий все ликеры?
Обновление
После нескольких исследований, похоже, я ожидаю, что Doctrine выполнит операцию SQL UNION
за кулисами, чтобы комбинировать наборы результатов от таблиц "виски" и "джина".
Это называется полиморфным запросом.
Согласно этот билет, эта функция недоступна в Doctrine 1.x. Он предназначен для выпуска 2.0. (также см. Doctrine 2.0 docs для CTI).
Итак, в свете этой информации, какой будет самый чистый и эффективный способ обойти этот недостаток? Переключиться на однонаправленное наследование? Выполните два запроса DQL и вручную объедините полученные Doctrine_Collections?