Скажем, что каждая запись в таблице TA указывает на ровно одну запись в таблице TB, которая, в свою очередь, указывает на ровно одну запись в таблице TC.Если мне нужно написать оператор выбора, чтобы получить некоторые результаты из таблицы TA, и я хочу включить условие, которое использует удаленный атрибут, определенный для записи, поступающей из таблицы TC, то я должен написать несколько операторов соединения, а также запомнить именапервичных и внешних ключей, которые связывают эти таблицы вместе.Что ж, это очень легко сделать, однако это также очень скучно, особенно когда вы пишете похожие объединения для решения похожих проблем в разных запросах ...
Было бы намного проще использовать объектную нотацию дляполучить доступ к дочерним записям / свойствам или что-то вроде этого:
"TA.TB.TC.attribute"
Я бы даже предпочел использовать обозначение пути:
"TA/TB/TC/attribute"
Конечно, чтобы что-то подобное работало там правильнодолжен быть способом предварительного определения связей таблиц, где-нибудь или что-то вроде этого (псевдокод):
table TA(
has one TB as "B"
on (TA.fkey = TB.pkey)
)
table TB(
has one TC as "C"
on (TB.fkey = TC.pkey)
)
Таким образом, мы могли бы написать инструкцию выбора следующим образом:
select * from TA where B/C/attribute = "something"
И интерпретатор может скрыть это:
select * from TA
join TB as B on (TA.fkey = TB.pkey)
join TC as C on (TB.fkey = TC.pkey)
where C.attribute = "something"
Кроме того, может даже существовать способ создания "ярлыков" для того, что я здесь называю "удаленными атрибутами".Пример:
table TA(
has one TB as "B"
on (TA.fkey = TB.pkey);
)
# define a "shortcut"
TA.C_attribute = TA/B/C/attribute;
Тогда C_attribute будет существовать как столбец для TA, но только виртуально, а не физически;тем не менее он станет видимым и доступным в запросах:
select * from TA where C_attribute = "something"
Это заставит синтаксический анализатор / интерпретатор пройти через все спецификации, предварительно определенные пользователем, а затем переписать SQL должным образом со всеми этими объединениями.
Итак, есть ли инструмент / инфраструктура, которая делает это в PHP?Я не имею в виду Доктрины - это не покрывает все эти требования, которые я прошел здесь.