2013-11-25 55 views
0
$query = $this->modx->newQuery('modResource'); 
$query->leftJoin('modTemplateVarResource', "price", array("modResource.id = price.contentid", "price.tmplvarid = 2")); 
$query->where(array("price:>=" => 6000)); 
$query->prepare(); 
echo $query->toSql(); 

返回值:xPDO编译整数作为字符串

`modResource`.`context_key` AS `modResource_context_key`, `modResource`.`content_type` AS `modResource_content_type`, `modResource`.`uri` AS `modResource_uri`, `modResource`.`uri_override` AS `modResource_uri_override`, `modResource`.`hide_children_in_tree` AS `modResource_hide_children_in_tree`, `modResource`.`show_in_tree` AS `modResource_show_in_tree`, `modResource`.`properties` AS `modResource_properties` 
FROM `modx_site_content` AS `modResource` 
LEFT JOIN `modx_site_tmplvar_contentvalues` `price` 
    ON (modResource.id = price.contentid 
     AND price.tmplvarid = 2) 
WHERE `modResource`.`price` >= '6000' 

为什么整数报价?它应该被视为一个int。

+0

有什么错有它作为字符串? –

+0

如果你执行一个查询,你试图找到更大或更小的值按整数你wolud有错误的结果,如果你的价值将被引用 – user1713785

+1

真的吗?你得到了什么特别错误的结果? (我希望你把'price'存储为int,否则* this *就是你的问题) –

回答

0

我似乎找到了另一个解决方案 - 最简单的方法是

$查询 - >在哪里(“price.value> = 6000“);

和最好的方式与okyanet溶液

$查询 - >其中结合( “CAST(price.value AS无符号整数)> = 6000”);

所有这些工作正确的xPDO

2

这可能不起作用,因为“price”是连接上使用的表别名;你需要在你那里对实际野外条件下 - price.value

$query = $this->modx->newQuery('modResource'); 
$query->leftJoin('modTemplateVarResource', "price", array("modResource.id = price.contentid", "price.tmplvarid = 2")); 
$query->where(array("price.value:>=" => 6000)); 
$query->prepare(); 
echo $query->toSql(); 

我几乎可以100%肯定WHERE条件将在这种情况下工作,即使作为一个字符串。但是,如果你仍然遇到了问题,你可以尝试铸造“price.value”作为一个整数(未测试):

$query = $this->modx->newQuery('modResource'); 
$query->leftJoin('modTemplateVarResource', "price", array("modResource.id = price.contentid", "price.tmplvarid = 2")); 
$query->where(array("CAST(price.value AS UNSIGNED INTEGER):>=" => 6000)); 
$query->prepare(); 
echo $query->toSql(); 

PS。浮点/十进制通常是价格更合适的类型,但是这取决于你;)

+0

如果您有一天来到莫斯科 - 我从我的啤酒xD – user1713785

+0

大坝,如果我使用功能在哪里然后XPDO将其封装在引号xD。你知道这个问题吗? – user1713785

+0

我认为在这种情况下(正如你在下面建议的那样),它应该作为字符串而不是数组添加到where条件中。然后它将完全按照写入的方式添加到查询中。谢谢你的啤酒:P – okyanet

0

适合我的方法是使用

$whereArray = array('CAST(:price.value:as unsigned)>=' => 6000); 
//then put it to 
$query->where($whereArray);