Для начала, с днем рождения! Всего наилучшего!
По сабжу: все это клево, но не оптимально.
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", ), ));