Сортировка по TV

сделал сортировку по цене. но сортировка проходит странно.

if($this->getProperty('sort')=='price.value'){
  $c->innerJoin('modTemplateVarResource',  'price', "price.contentid = {$this->classKey}.id AND price.tmplvarid = 12");
}

результат по убыванию

94.77
90.16
9.8
9.5
9.3
9
89.65
87.3
85.85

результат по возрастанию

10.05
10.95
106.15
106.66
11
11.4

я так понимаю, сортировка идет в строковом представлении. как исправить ситуацию, знает кто-нибудь?

Comments

для этого есть простая хитрость в mysql синтаксисе, чтоб сортировала как числовое значение, а не как текст пишешь ORDER BY (value+0), не знаю как с join-ом но такой

$query = $modx->newQuery('modResource');
$query->where(array(
   'parent' => 70,
));
$query->groupby('id+0','DESC');
$boxes = $modx->getCollection('modResource',$query);
foreach($boxes as $key=>$val){
    $id[$key]=$val->get('id');
}
print_r($id);

запрос выполнился.

проверил на проекте с числовыми тв вот результаты: как текст, как число

cgfcb.j nt,t ,jkmijt lj,hsq xtkjdtr

что в переводе с древне-транслитерийского означает «Спасибо тебе, добрый человек»

маленькая замечание в параметры процессора если записывать

$params = [ 'sort' => 'price.value+0' ]

то не робит, а если

$params = [ 'sort' => 'price.value +0' ]

то все ок. странно это

там наверное описка, работает

$params=['sort'=>'price.value'+0]

Ничего странного в этом нет. PHP — язык с динамической типизацией, т.е. сложив строку (символьное представление цены) с числом, получается число.

PHP — язык с динамической типизацией, т.е. сложив строку(символьное представление цены) с числом, получается число.

А при чем тут PHP? В данном случае это вопрос к MySQL. PHP (xPDO) только подготовит запрос вида price.value + 0, а вот в типу данных Число уже сам мускул приведет.

там наверное описка, работает $params=['sort'=>'price.value'+0]

Кстати, только сейчас обратил внимание. Нет, так не правильно. Правильно именно $params=['sort'=>'price.value +0']

А вообще, если кому-то не нравится хак с +0 (что вполне нормально), можно так пробовать:

$q->sortby("CAST(price.value as unsigned)");

В процессе появилась еще проблема. Код:

$classKey = 'modResource';
$c = $modx->newQuery($classKey);
$c->innerJoin('modTemplateVarResource',  'users', "users.contentid = $classKey.id AND users.tmplvarid = 14");
$c->select(array(
    "$classKey.id as id"
    ,"users.value as users"
));
$c->sortby('users.value+0','asc');
$where = array('users.value:>=' => intval($users));
$c->where($where);

Сортирует прекрасно, но фильтр по условию опять же почему-то в строковом представлении. Т.е. если взять ('users.value:<=' => 5), то в результатах будут 5, 100, 150

отвечаю сам себе modxclub.ru/topics/xpdo-vse-polya-prisoedinyonnyix-tablicz-tipiziruet-kak-strokovyie-1664.html

$c->where(array("CAST(users.value AS unsigned) >= $users"));