P.S. И вероятно предполагалось modTemplateVarResource, а не modTemplateVarTemplate.
Да, верно.
Он не может знать является ли указанный алиас алиасом xPDO-объекта или просто алиас временной таблицы
Так ведь в методе innerJoin первым параметром передаётся имя xPDO-объекта, вторым псевдоним, третьим — условие с использованием этого псевдонима. Если название таблицы в составе условия совпадает с псевдонимом, указанным вторым параметром, то однозначно это псевдоним xPDO-объекта, указанного первым параметром. Иначе быть не может, поскольку в выборке не могут участвовать 2 таблицы с одинаковыми псевдонимами.
Т.е. алгоритм проверки должен быть таким:
1) если имя таблицы в условии совпадает с псевдонимом присоединяемой таблицы => это и есть присоединяемая таблица => типизируем как положено
2) если имя таблицы в условии не совпадает с псевдонимом присоединяемой таблицы => парсим поле как строковое (т.к. ситуация неопределённая)
И xPDO этой элементарной проверки почему-то не выполняет…
А вот сформировать правильный запрос можно.
Я просто пример привёл такой со стандартной таблицей. В этом примере — да, логически правильнее внести фильтрацию по TV в ON. Но во многих других случаях (в т.ч. и с участием собственных таблиц) дополнительные условия должны содержаться в WHERE. Особенно, если запрос большой и частично он строится в одних методах, частично — в других.
В любом случае, проблема имеет место, не зависимо от того, где присутствует условие — в WHERE или в ON.