Для начала, с днем рождения! Всего наилучшего! По сабжу: все это клево, но не оптимально. 1. На все это давно уже есть getdata-процессор. 2. Раз уж вы в рамках xPDO работаете, то и стройте запросы на нем.
Во-первых, запрос SELECT * FROM modx_site_content
LEFT JOIN modx_site_tmplvar_contentvalues
ON modx_site_tmplvar_contentvalues
.contentid
= modx_site_content
.id
WHERE (
modx_site_tmplvar_contentvalues
.tmplvarid
= (
SELECT modx_site_tmplvars
.id
FROM modx_site_tmplvars
WHERE modx_site_tmplvars
.name
='icon'
) AND
modx_site_tmplvar_contentvalues
.value
= 'example-icon'
)
OR (
modx_site_tmplvar_contentvalues
.tmplvarid
= (
SELECT modx_site_tmplvars
.id
FROM modx_site_tmplvars
WHERE modx_site_tmplvars
.name
='isCosmos'
) AND
modx_site_tmplvar_contentvalues
.value
= 'IS'
) Переделаем на SELECT * FROM modx_site_content
c
INNER JOIN modx_site_tmplvar_contentvalues
tvv
ON tvv
.contentid
= c
.id
INNER JOIN modx_site_tmplvars
tv
ON tvv.tmplvarid = tv.id
WHERE (
tv.name
='icon'
AND
tvv
.value
= 'example-icon'
)
OR (
tv.name
='isCosmos'
AND
tvv
.value
= 'IS'
) Здесь нет смысла использовать LEFT JOIN, ибо по условию вы все равно требуете значения, а значит отсутствующие записи не пройдут. Но если хотите универсальности в плане того, что будут запросы без дополнительных условий и чтобы в выборку попадали документы, для которых нет ни одной ТВшки, то да, нужно LEFT JOIN использовать. Во-вторых, переделаем это на xPDO: $c = $modx->newQuery('modResource');
$c->leftJoin('modTemplateVarResource', 'TemplateVarResources');
$c->leftJoin('modTemplateVar', 'tv', "tv.id=TemplateVarResources.tmplvarid");
$c->where(array( array( "tv.name" => 'icon', "TemplateVarResources.value" => "example-icon", ), array( "OR:tv.name:=" => 'isCosmos', "TemplateVarResources.value" => "IS", ), ));