只需为您要搜索的每台电视加入一个 modTemplateVar 表。请注意连接中的第三个参数,其中包含 ON 术语。确保您指定了您想要获取的正确电视 ID。
$value = "Mexico";
$c = $modx->newQuery('modResource');
$c->innerJoin('modTemplateVar', 'TV1', 'TV1.contentid = modResource.id AND TV1.tmplvarid = X');
$c->innerJoin('modTemplateVar', 'TV2', 'TV2.contentid = modResource.id AND TV2.tmplvarid = Y');
$c->innerJoin('modTemplateVar', 'TV3', 'TV3.contentid = modResource.id AND TV3.tmplvarid = Z');
$c->where(array(
'TV1.value:LIKE' => $value,
'TV2.value'...,
'TV3.value'...
));
$resources = $modx->getCollection('modResource',$c);
请注意,这是未经测试的,但它应该让您大致了解应该如何设置查询。您可能需要在 ON 子句中的表名中添加一些反引号,不知道 xPDO 解析器对此有多挑剔。
另请注意,这不是对较大集合的非常有效的查询。实现这一点的最有效方法是制作一个适合您需要的自定义 xpdo 对象,但如果您只需要它用于这种特定情况,那将是一个相当大的项目。
如果可能的话,您也可以尝试调用 getResources,在该调用中添加电视连续词相当容易。它仍然很慢,因为它使用或多或少相同的连接完成,但至少您不必为解决方案进行故障排除。
[[getResources?
&parents=`1,2,3...`
&depth=`10`
&tpl=`yourTemplateForEachResource`
&tvFilters=`nameOfTV1==%[[+value]]%,othertv==othervalue`
]]
请注意,tvFilters 字符串中的逗号是 AND,双管道是 OR。并以编程方式进行:
$value = 'Mexico';
$resources = $modx->runSnippet('getResources', array(
'parents' => '1,2,3...',
'depth' => 10,
'tpl' => 'yourTemplateForEachResource',
'tvFilters' => 'nameOfTV1==%' . $value . '%,othertv==othervalue'
));
我想构建自己的查询通常会更快,但是 getResources 内置了一些缓存和优化,从长远来看可能会获胜(如果使用正确)。