2013-11-25 2 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

Если вы выполняете запрос, в котором вы пытаетесь найти большее или меньшее значение по целому числу, вы получите неверные результаты, если бы ваше значение было указано в – user1713785

+1

Действительно? Какие конкретные неправильные результаты вы получили? (Я надеюсь, что вы храните 'price' как int. В противном случае * это * ваша проблема) –

ответ

0

Кажется, я нашел другое решение - самый простой способ

$ query-> где ("price.value> = 6000 ");

и лучший способ сочетать с okyanet раствором

$ query-> где ("CAST (price.value А.С. целое без знака)> = 6000");

Все они работает правильно xPDO

2

Возможно, это не работает, потому что «цена» - это псевдоним таблицы, используемый для соединения; вам нужно запустить, когда условие против фактического поля - 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% уверен где условие будет работать в этом случае, даже в виде строки. Однако, если вы все еще сталкиваетесь с проблемами вы можете попробовать литья «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);