Олег Анатольевич
16 мая 2015 г., 18:25

Сортировка по 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
я так понимаю, сортировка идет в строковом представлении. как исправить ситуацию, знает кто-нибудь?
для этого есть простая хитрость в mysql синтаксисе, чтоб сортировала как числовое значение, а не как текст пишешь ORDER BY (value+0), не знаю как с join-ом но такой
<?php $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

Добавить комментарий