ModX Revo:查询多台电视?

时间:2013-08-19 19:42:41

标签: php modx

我正在将网站迁移到ModX Revolution并且没有使用xPDO的经验。
我正在移动的网站有一个搜索功能,可以查看分配给某些资源的几台电视并返回适用的页面。
我在使用xPDO时遇到了麻烦。

我可以将电视设置为给定值的所有页面都返回,但我无法弄清楚如何将其扩展为:Find all resources where TV1 == X, TV2 == Y, TV3 == Z
如何一次查询多台电视?

$value = "Mexico";
$c = $modx->newQuery('modResource');
$c->innerJoin('modTemplateVarResource','TemplateVarResources');
$c->where(array(
     'TemplateVarResources.tmplvarid' => 7,
     '"'.$value.'" IN (TemplateVarResources.value)',
));

$resources = $modx->getCollection('modResource',$c);

3 个答案:

答案 0 :(得分:0)

嗯,我觉得它是这样的:

$c->where(array(
     'TV1:=' => 'X'
     'AND:TV2:=' => 'Y'
     'AND:TV3:=' => 'Z'
));

最好查看以下文档:http://rtfm.modx.com/xpdo/2.x/class-reference/xpdoquery

答案 1 :(得分:0)

我的代码中的两个电视的工作示例:reserved(id:11)和cost_obj(id:12)

$c->leftJoin('modTemplateVarResource', 'cost_obj', array('modResource.id = cost_obj.contentid', 'cost_obj.tmplvarid = 12'));
$c->leftJoin('modTemplateVarResource', 'reserved', array('modResource.id = reserved.contentid', 'reserved.tmplvarid = 11'));
$c->query['where'][0][0][] = new xPDOQueryCondition(array(
   'sql' => 'CAST(`reserved`.`value` as UNSIGNED INTEGER) > ?',
   'binding' => array(
                     'value' => 0,
                     'type' => PDO::PARAM_INT,
                     'length'=>0),
   'conjunction'=>'AND')
);
$c->query['where'][0][1][] = new xPDOQueryCondition(array(
   'sql' => 'CAST(`cost_obj`.`value` as UNSIGNED INTEGER) > ?',
   'binding' => array(
                     'value' => 0,
                     'type' => PDO::PARAM_INT,
                     'length'=>0),
   'conjunction'=>'AND')
);
$c->query['where'][0][2][] = new xPDOQueryCondition(array(
   'sql' => 'CAST(`reserved`.`value` as UNSIGNED INTEGER) >= CAST(`cost_obj`.`value` as UNSIGNED INTEGER)',
   'conjunction'=>'AND')
);

此查询等于

reserved > 0 AND cost_obj > 0 AND reserved >= cost_obj

答案 2 :(得分:0)

只需为您要搜索的每台电视内部加上一个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`
]]

请注意,逗号是AND,双管道是tvFilters字符串中的OR。并以编程方式执行:

$value = 'Mexico';
$resources = $modx->runSnippet('getResources', array(
    'parents' => '1,2,3...',
    'depth' => 10,
    'tpl' => 'yourTemplateForEachResource',
    'tvFilters' => 'nameOfTV1==%' . $value . '%,othertv==othervalue'
));

我认为构建自己的查询通常会更快但是内置到getResources中的一些缓存和优化可能会在长期内获胜(如果使用得当)。

相关问题