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